Javascript代码包含在html中时可以工作,但单独加载/注入时则不能工作

Javascript code is working when contained within html but not when loaded/injected separately

本文关键字:工作 单独 加载 不能 注入 包含 代码 html Javascript      更新时间:2023-09-26

我有以下代码,当嵌入到加载的html页面中时,这些代码可以成功工作:

<HEAD>
<script language="javascript" type="text/javascript">
document.addEventListener('DOMContentLoaded', function () 
{
    document.documentElement.addEventListener("touchstart", function (e) 
    {
            if (['A', 'BUTTON'].indexOf(e.target.tagName) === -1)
            {
                e.preventDefault();
                e.stopPropagation();
                invokeObjectiveC("ontouchstart:");
            }
            else
            {
                e.preventDefault();
                e.stopPropagation();
                invokeObjectiveC(e.target);
            }
    }, true);
}, false);

function invokeObjectiveC(action) {
    ...
}

然而,如果我把它从html中取出,并尝试单独加载,那么它就不起作用了。当单独加载时,它看起来像这样:

alert('test');
function addListener()
{
    alert('adding listener');
    document.addEventListener('DOMContentLoaded', function () 
          {
          document.documentElement.addEventListener("touchstart", function (e) 
                        {
                        alert('touchstart');
                        if (['A', 'BUTTON'].indexOf(e.target.tagName) === -1)
                        {
                        e.preventDefault();
                        e.stopPropagation();
                        invokeObjectiveC("ontouchstart:");
                        }
                        else
                        {
                        e.preventDefault();
                        e.stopPropagation();
                        invokeObjectiveC(e.target);
                        }
                        }, true);
          }, false);

}
addListener();

function invokeObjectiveC(action) {
   ...
}

添加时,会显示一个"测试"和一个"添加侦听器"警报对话框,这样我就知道这部分正在工作。然而,该代码不起作用——它应该检测屏幕某些部分的触摸(这在iOS上)。有了html中的代码,一切都很好,当触摸屏幕时就会执行,当单独加载时,触摸屏幕时不会发生任何事情。有什么想法吗?

====更新我尝试在生命周期的各个阶段运行以下程序,包括在发出加载页面的请求之前,但"Dom content loaded"从未出现:

var script = document.createElement('script');  
script.type = 'text/javascript';  
script.text = 
var Test =
{
f: function()
    {
        if (!event.originalTarget.defaultView.frameElement) 
        {
            alert('DOM content loaded');
        }
    }
}
function addTestListener()
{
    alert('adding listener');
    window.addEventListener("DOMContentLoaded", function(e) { Test.f(); }, false);
}

document.getElementsByTagName('head')[0].appendChild(script);

根据您对iOS功能的评论,我怀疑在您尝试执行javascript时,文档已经加载。如果是这种情况,那么DOMContentLoaded事件已经发生,因此代码永远不会初始化。你可以通过检查文档是否已经加载来解决这个问题,方法是将代码更改为:

function addListener() {
    alert('adding listener');
    function init() {
        document.documentElement.addEventListener("touchstart", function (e) {
            alert('touchstart');
            if (['A', 'BUTTON'].indexOf(e.target.tagName) === -1) {
                e.preventDefault();
                e.stopPropagation();
                invokeObjectiveC("ims-ontouchstart:");
            } else {
                e.preventDefault();
                e.stopPropagation();
                invokeObjectiveC(e.target);
            }
        }, true);
    }
    if (document.readyState === "complete") {
        init();
    } else {
        document.addEventListener('DOMContentLoaded', init, false);
    }
}
addListener();
function invokeObjectiveC(action) {
   ...
}

我更改了行

函数addListener()

进入

window.onload=函数addListener()

它似乎已经完成了

相关文章: