javascript - Uncaught ReferenceError : X is not defined

标签 javascript google-chrome-extension

此代码用于 Chrome 扩展程序。 当我调用 "showOrHideYT()" 函数时,我得到一个

"Uncaught ReferenceError: showOrHideYT is not defined | (anonymous function) | onclick"

此代码将在页面中搜索 youtube 链接,它会在链接旁边添加一个按钮(它实际上是一个带有事件的 div)以显示带有嵌入式视频的 iframe,非常类似于 Reddit Enhancement Suite。考虑一下代码本身是不完整的。我只想知道调用 "showOrHideYT(frameZES12345)" 函数时我错过了什么。

如果需要,我可以提供 manifest.json。

谢谢

function showOrHideYT(id)
{
    var YTvidWidth  = 420;
    var YTvidHeight = 315;
    frameYT=getElementById(id);
    console.log(frameYT.style.visibility);
    if (frameYT.style.visibility == "hidden")
        {
        frameYT.style.width = YTvidWidth+"px"; 
        frameYT.style.height = YTvidHeight+"px"; 
        frameYT.style.visibility = "visible";
        }
    if (frameYT.style.visibility == "visible")
        {
        frameYT.style.width = "0px"; 
        frameYT.style.height = "0px"; 
        frameYT.style.visibility = "hidden";
        }
};


// DOM utility functions
function insertAfter( referenceNode, newNode ) {
    if ((typeof(referenceNode) == 'undefined') || (referenceNode == null)) {
        console.log(arguments.callee.caller);
    } else if ((typeof(referenceNode.parentNode) != 'undefined') && (typeof(referenceNode.nextSibling) != 'undefined')) {
        if (referenceNode.parentNode == null) {
            console.log(arguments.callee.caller);
        } else {
            referenceNode.parentNode.insertBefore( newNode, referenceNode.nextSibling );
        }
    }
};
function createElementWithID(elementType, id, classname) {
    obj = document.createElement(elementType);
    if (id != null) {
        obj.setAttribute('id', id);
    }
    if ((typeof(classname) != 'undefined') && (classname != '')) {
        obj.setAttribute('class', classname);
    }
    return obj;
};
/////////////////////////////////////// 



$(document).ready(function() {

    
    var vidWidth    = 420;
    var vidHeight   = 315;
    var linksSemID  = document.getElementsByTagName("a") ;

    for (var i = 0; i < linksSemID.length; i++){
        if (/id=$/.test(linksSemID[i].href)) links[i].href += "1";
    }

    i=0;
    var youTubeRegExp = /(?:v=)([\w\-]+)/g;                 
    var forEach = Array.prototype.forEach;                  
    var linkArray = document.getElementsByTagName('a');     

    forEach.call(linkArray, function(link){                 
        linkArray.id="zes" + i++;                           
        
        var linkTarget = link.getAttribute('href');         
        if (linkTarget!=null)                               
            {
            if (linkTarget.search(youTubeRegExp) !=-1)      
                {
                
                console.log (linkTarget);
                idVideo=linkTarget.match(/(?:v=)([\w\-]+)/g);
                //idVideo = idVideo.replace("v=", "");      
                
                //add buton
                botaoMais = document.createElement('DIV');
                botaoMais.setAttribute('class','expando-button collapsed video');
                botaoMais.setAttribute('onclick','showOrHideYT(frameZES'+ i +')');
                insertAfter(link, botaoMais);

                
                
                //add iframe
                ifrm = document.createElement('IFRAME'); 
                ifrm.setAttribute('src', 'http://www.youtube.com/embed/'+ idVideo); 
                ifrm.style.width = '0px'; 
                ifrm.style.height = '0px'; 
                ifrm.style.frameborder='0px';
                ifrm.style.visibility = 'hidden';
                ifrm.setAttribute('id', 'frameZES' + i);
                insertAfter(link, ifrm);
                
                }
            }
    });  

});

最佳答案

当您将 setAttribute 与字符串一起使用时,事件将在页面的上下文中执行。内容脚本中定义的函数在沙盒范围内执行。所以,你必须传递一个函数引用,而不是一个字符串:

替换:

    botaoMais.setAttribute('onclick','showOrHideYT(frameZES'+ i +')');

与:

    botaoMais.addEventListener('click', (function(i) {
        return function() {
            showOrHideYT("frameZES"+ i);
        };
    })(i));

代码解释:

  • (function(i) { ..})(i) 用于为每个事件保留 i 的值。
  • 在这个自调用函数中,返回另一个函数,用作点击的事件监听器。

关于javascript - Uncaught ReferenceError : X is not defined,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8893786/

相关文章:

javascript - 如何在 onload 事件之前运行 JavaScript 片段(Google Chrome 扩展)

javascript - 列出带有 chrome 扩展名的本地目录

javascript - 如何更改 Firefox 插件上的脚本位置?

javascript - 当鼠标悬停在 <a> 标签元素中时,如何完全改变图像的颜色?

javascript - 用 JQuery 替换没有 ID/类的图像

javascript - 在标签页中打开 Chrome 应用

javascript - 制作 Chrome 扩展时如何导入文件

javascript - 将函数附加到 onClick()/onPress()

javascript - AngularJS - 处理现有 DOM 元素上的点击事件

javascript - 使用 mocha 进行测试时 findOne 不是函数