我有一个包含自定义jQuery事件处理程序的远程javascript文件。当它作为<script src='...'></script>
元素插入DOM时,自定义事件处理程序未注册。
但是,如果我添加与直接JS(<script>...</script>
)完全相同的脚本,则会注册事件处理程序,并且所有内容都按预期执行。
当脚本作为远程文件插入时,为什么不在jQuery中绑定事件处理程序?
远程文件,包含自定义事件处理程序:
console.log('Before custom event handler');
$('button').on('customEvent', function(){
console.log('customEvent Caught');
});
https://gist.github.com/2767385
将脚本插入DOM的(非工作)javascript:
var scriptNode = document.createElement('script');
scriptNode.src = 'https://gist.github.com/raw/2767385/b9ddea612ff60b334bd2430e59903174e527a3b5/gistfile1.js';
document.body.appendChild(scriptNode);
(工作替代)javascript,它将脚本作为内联插入到DOM中:
var scriptText = "console.log('Before custom event handler'); $('button').on('customEvent', function(){ console.log('customEvent Caught'); });",
scriptNode = document.createElement('script');
scriptNode.appendChild(document.createTextNode(scriptText));
document.body.appendChild(scriptNode);
触发事件:
$('button').triggerHandler('customEvent');
正确读取JS,并正确执行处理程序。
远程文件 - 非工作示例:http://jsfiddle.net/3CfFM/3/
使用文字 - 工作替代方案:http://jsfiddle.net/3CfFM/2/
当脚本作为远程文件插入时,为什么不在jQuery中绑定事件处理程序?
答案 0 :(得分:1)
triggerHandler('customEvent')
触发的原始事件,因为它的冒泡和捕获已经完成。
如果您等待一秒钟,然后再次单击该按钮,您将看到事件处理程序确实已被绑定。您还可以通过延迟triggerHandler
调用直到脚本加载来看到这一点:
$('button').click(function() {
var scriptNode = document.createElement('script');
scriptNode.src = 'https://gist.github.com/raw/2767385/897cffca74411dbb542c0713bacb5a4048d6708b/gistfile1.js';
scriptNode.onload = function() {
$('button').triggerHandler('customEvent');
};
document.body.appendChild(scriptNode);
});