kingda_young 2014-03-19 12:54 采纳率: 0%
浏览 789

关于使用javascript的宿主对象window的不解

前段时间看了javascript dom的编程艺术,就想实现一下里面的例子,其中有讲到图片库向后兼容的问题,本来这样子就可以实现图片的切换:

js:
function showPic(Whichpic){
var placeholder = document.getElementById("placeholder");
var source = Whichpic.getAttribute("href");
placeholder.setAttribute("src",source);

}
这样子可以实现没有问题,问题是书介绍了要兼容的问题,因此改了代码,

把onclick函数去掉。js中增加:function prepareGallery(){
if(!document.getElementsByTagName)return false;
if(!document.getElementById)return false;
var gallery = document.getElementById("nav");
var links = gallery.getElementsByTagName("a");
for(var i=0;i<links.length;i++)
{
links[i].onclick=function(){

        return !showPic(this);
    }
}

}
结果一运行showPic是运行了,但是链接还是被点了进去,也就是说for循环里面没有返回false~不知道是什么问题??求解。。。。。。

  • 写回答

1条回答

  • ChatGPTᴼᴾᴱᴺᴬᴵ 2023-12-09 18:56
    关注

    所有内容均由人工智能模型输出,其内容的准确性和完整性无法保证,不代表我的态度或观点。
    (文心一言专栏,V2.5.2版本,2023.12.09)


    该回答引用文心大模型3.5,仅提供参考,不保证完全正确
    你的问题可能在于,你在for循环中设置的onclick函数,并没有正确地绑定到每个链接元素上。在JavaScript中,当你在循环中创建一个函数,并且试图将这个函数作为回调函数,那么每次循环实际上都会创建一个新的函数实例。这就意味着,尽管你试图将函数返回值作为onclick事件的回调,但每次循环时都会创建一个新的函数实例,它们并不会共享你期望的this上下文。


    在JavaScript中,你可以使用一种叫做"闭包"的概念,来让循环中的每个元素共享同一个函数实例。以下是一种可能的解决方案:

    function prepareGallery() {
        if(!document.getElementsByTagName) return false;
        if(!document.getElementById) return false;
        var gallery = document.getElementById("nav");
        var links = gallery.getElementsByTagName("a");
    
        for(var i=0; i<links.length; i++) {
            (function(i) {
                links[i].onclick = function() {
                    return !showPic(this);
                }
            })(i);
        }
    }
    

    在上述代码中,我使用了一个立即执行的函数表达式(IIFE)来创建一个新的作用域,并在这个新的作用域中绑定了i的值。这样,每次循环都会创建一个新的作用域,并且每个链接都会绑定到这个新作用域中的showPic函数。这样就可以确保thisshowPic函数中正确地引用到当前的链接元素。


    希望这个解答对你有所帮助!如果你还有其他问题,欢迎继续提问。

    评论

报告相同问题?

悬赏问题

  • ¥20 码源版uec++编译环境问题
  • ¥15 codesys在仿真一次后无法增删变量
  • ¥20 RC522开发硬件系统刷卡异常
  • ¥15 simpack与simulink联合仿真
  • ¥15 VBA显示应用程序定义或者对象定义错误:
  • ¥15 关于#linux#的问题:minio输入密码能登录,但登录后为空白页面
  • ¥200 数据库架构方案有偿咨询
  • ¥15 matlab对包含滑台的机械臂求正逆解与轨迹规划
  • ¥15 Android13 systemui悬浮通知加载流程
  • ¥15 安卓7root后,出现数据异常,请先调用EntryUtil.setCallback