Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/434.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript代码在包含在html中时有效,但在单独加载/注入时无效_Javascript_Html - Fatal编程技术网

Javascript代码在包含在html中时有效,但在单独加载/注入时无效

Javascript代码在包含在html中时有效,但在单独加载/注入时无效,javascript,html,Javascript,Html,我有以下代码,当嵌入到加载的html页面中时,这些代码可以成功工作: <HEAD> <script language="javascript" type="text/javascript"> document.addEventListener('DOMContentLoaded', function () { document.documentElement.addEventListener("touchstart", function (e) {

我有以下代码,当嵌入到加载的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) {
    ...
}
添加后,将显示一个“测试”和一个“添加侦听器”警报对话框,因此我知道这部分正在工作。 然而,这段代码不起作用——它应该在屏幕的某些部分检测触摸(这是在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()


当你说“单独加载”时,它似乎起了作用,你是什么意思?加载DOM后是否手动加载它?如果是这样,则可能已经触发了
DOMContentLoaded
事件,因此您的处理程序永远不会被调用。我正在使用名为stringByEvaluatingJavaScriptFromString的iOS函数来执行脚本。我已经尝试在页面加载之前和之后执行它。感谢您的回复。在包含页面和页面本身的视图的不同加载阶段,有几个机会运行javascript(提供了viewWillLoad、WebViewDidDisplay、webViewDidStartLoad等回调)。我已经尝试了我的原始代码、您的代码和一些新代码,这些代码是我在上面的每个可能的阶段作为更新添加的,但没有成功。@Woofbeans-您能够检查任何javascript错误吗?您是否能够在代码中设置断点并跟踪它以查看发生了什么?这可能是一个更高级的调试的例子,以实际查看正在发生的情况,而不仅仅是尝试一些事情。设置断点是不可能的,我可以使用警报来显示相关信息吗?@Woofbeans-抱歉,我对您所处的iOS环境一无所知。A显示了一些可能性,包括。
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) {
   ...
}