Javascript Can';t从pageshow函数修改innerHTML

Javascript Can';t从pageshow函数修改innerHTML,javascript,jquery,html,jquery-mobile,Javascript,Jquery,Html,Jquery Mobile,我正在制作一个JQuery移动web应用程序,遇到了一个有趣的问题。我试图从pageshow函数中动态注入页面内容。我知道正在调用pageshow函数,因为console.log打印正确,但是,测试HTML不会出现在页面中 页面显示功能的代码: for(var i = 0; i < landmarkList.length; i++) { var pageId = landmarkList[i].landmarkLink.substring(1, landmarkList[i].la

我正在制作一个JQuery移动web应用程序,遇到了一个有趣的问题。我试图从
pageshow
函数中动态注入页面内容。我知道正在调用
pageshow
函数,因为
console.log
打印正确,但是,测试HTML不会出现在页面中

页面显示功能的代码:

for(var i = 0; i < landmarkList.length; i++)
{
    var pageId = landmarkList[i].landmarkLink.substring(1, landmarkList[i].landmarkLink.length);
    $(document).on('pageshow','#' + pageId,function(){
        console.log("Init Map for page: " + pageId);
        document.getElementById("map_" + pageId).innerHTML = 'TEST';
    });
}
for(变量i=0;i
以下是一个例子: . 单击一行时,会加载
pageShow
函数,但innerHTML不会添加到
div
,也不会产生错误

你知道为什么不会发生这种情况吗

谢谢。

您误用了委托事件处理程序(它不是为每个元素设计的)。如果可以从页面提取页面id,则根本不需要循环

基本上,循环中的
pageId
值在点击此行时不再有效(因为它在循环修改该值很久之后被回调):

如果您能提供一个HTML示例,我将使其准确无误,但类似于:

// e.g. Match pageShow events from any pages with data-role=
$(document).on('pageshow','[data-role=page]', function(){
    var $page = $(this);
    // Extract the page id from the page element (pageId is locally scoped to this callback)
    var pageId = $page.attr('id');
    console.log("Init Map for page: " + pageId);
    $("#map_" + pageId).html('TEST');
 });
地图和页面之间很可能存在某种关系,但如果没有HTML,很难提供更好的选择器

更新: 查看实际的页面HTML,每个“页面”都有一个
data role=“page”
属性。这应该是委派事件选择器的目标。然后,您可以从该页面获取id,在其前面加上“map_u2;”,并直接找到匹配的地图

可缩短为:

// e.g. Match pageShow events from any pages with data-role=
$(document).on('pageshow','[data-role=page]', function(){
    console.log("Init Map for page: " + this.id);
    $("#map_" + this.id).html('TEST');
});
委派的事件处理程序: 委托事件处理程序通过侦听所需元素的祖先来工作,然后当所选事件冒泡到该元素时,它应用jQuery选择器来查找所需元素,然后将函数应用到导致事件的任何匹配元素

如果您没有一个方便、不变的祖先,请使用
$(document).on
,但决不要使用
$(“body”)。on
因为
body
对委托事件有一些奇怪的副作用

委派事件有几个好处:

  • 简化和分离事件代码
  • 您没有向项目添加单个处理程序的开销

它确实在大图像下方的DIV中显示文本。你用的是什么浏览器?验证它是否在其他浏览器中工作。Hmmm。我在OSX10.9上使用Safari、Firefox和Chrome。您使用的是什么配置?请提供您的HTML示例,以便我可以准确地给出以下示例:)这是页面的HTML:这是运行页面的JS:谢谢您的时间。我是否提供了足够的示例HTML以使示例准确?页面ID是从名称的子字符串创建的(但我可以将“Page-”放在前面)。这些地图是通过放置“map_”+pageId.Done。。。在代码中尝试一下。摆脱你的
for
循环(不需要)。非常感谢你的帮助。为什么循环不是必需的,它只显示细节页面?(我很着迷,因为它只显示在正确的位置,但我不知道它如何知道要显示哪些页面)这是因为它搜索“地图”id吗?谢谢。那么在调用这个函数之后,这个方法是否会对每个页面运行,但它不会进行替换,因为其他页面没有映射id?
// e.g. Match pageShow events from any pages with data-role=
$(document).on('pageshow','[data-role=page]', function(){
    console.log("Init Map for page: " + this.id);
    $("#map_" + this.id).html('TEST');
});