通過js添加的DOM節點的click事件綁定不上的解決方案以及IOS下click事件委派失效的解決方案
阿新 • • 發佈:2018-02-24
之前 obj cli 並且 create 使用 引入 gpo 聲明
問題描述:
如以下代碼所示,通過js添加的Dom節點,在其上綁定點擊事件,有的時候會出現點擊事件不響應的情況,按照正常的理解,js代碼具有阻塞性,Dom節點添加成功之後,就可以找到該節點並綁定事件,沒有道理會出現事件綁定不上的問題,但是這種情況的確是遇到了多次,問題原因有待日後深入理解,下面記載一下問題的解決方案。
解決方案:
方案一:將事件綁定直接寫在行內標簽上"<thead onclick=‘myFunction(this)‘ >",其中,this代表的是當前元素,是一個原生對象,如果需要傳一個jQuery對象作為參數,直接寫
"<thead onclick=‘myFunction($(this))‘ >"即可。
同時,事件函數的聲明也是應該放到該段代碼執行之前,比如先引入的公用的js文件中。
方案二:通過事件委派來添加,但是考慮到委派到document上面的事件太多,會增加負擔,所以自己在使用的過程中,采用了方案一。
mui.ajax(‘url‘,{ data:{}, dataType:‘jsonp‘, type:‘post‘, timeout:10000, success:function(data){ var obj = eval(‘(‘+data+‘)‘); var result = obj.data; var html=‘‘; var frag=document.createDocumentFragment(); html="<table>" +"<thead onclick=‘myFunction(this)‘ class=‘myThead‘>" +"<td>序號</td>" +"<td>標題1</td>" +"<td>標題2</td>" +"<td>標題3</td>" +"<td>標題4</td>" +"<td>標題5</td>" +"<td>標題6</td>" +"<td>標題7</td>" +"</thead>" +"</table>"; frag=html; $(‘body‘).append(frag); // $(‘.myThead‘).click(function() { // alert(‘clicked‘); // }); // function myFunction() { // alert(‘clicked‘); // } }, error:function(xhr,type,errorThrown){ mui.toast(‘網絡異常,請稍後再試‘); } });
如果是采用方案二的話,在ios上面還可能會遇到委派事件失效的問題,具體的問題描述及解決方案如下:
問題描述:
當使用委派給一個元素添加click
事件時,如果事件是委托到 document
或 body
上,並且委托的元素是默認不可點擊的(如 div
, span
等),此時 click
事件會失效
解決方案:直接給需要添加點擊事件的元素添加以下CSS屬性即可
cursor:pointer;
通過js添加的DOM節點的click事件綁定不上的解決方案以及IOS下click事件委派失效的解決方案