Javascript代码在包含在html中时有效,但在单独加载/注入时无效
我有以下代码,当嵌入到加载的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) {
<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) {
...
}