【问题标题】:Completely lost with JavaScript events and OpenLight完全迷失在 JavaScript 事件和 OpenLight 中
【发布时间】:2011-06-21 02:20:46
【问题描述】:

一位客户给了我一组功能,以便在客户端检查是否安装了 OpenLight。 Firefox 和 IE 运行良好,但 Chrome 总是告诉我没有安装 OpenLight。

但是,我真的不明白如何追踪这一点,因为我完全不知道发生了什么。我在 Google 上搜索了事件的名称,但在 Google 中只得到 0 个结果:S 例如,以下是在 Firefox 中检查的代码:

function isOpenLightInstalled() {
    try
    {
        var element = document.createElement("MyOpenLightDataElement");
        document.documentElement.appendChild(element);
        var evt = document.createEvent("Events");
        evt.initEvent("MyOpenLightEvent", true, false);
        element.dispatchEvent(evt);
        if (element.getAttribute("reply") == "1")
        {
            return true;
        }
    }
    catch(err)
    {
    }
    return false;
}

这是在做什么?那些事件是什么?它如何知道它正在检查 OpenLight?

以下是Chrome功能:

function isOpenLightInstalled() {
    try
    {
        var customEvent = document.createEvent('Event');
        customEvent.initEvent('GCOLCustomEvent', true, true);
        var element = document.getElementById("GCOpenLightDataElement");
        element.dispatchEvent(customEvent);
        if (element.getAttribute("reply") == "1")
        {
            return true;
        }
    }
    catch(err)
    {
    }
    return false;
}

有人可以在这里说明一下吗:(

【问题讨论】:

    标签: javascript google-chrome dom-events


    【解决方案1】:

    这是在做什么?那些事件是什么?它如何知道它正在检查 OpenLight?

    1. 它尝试创建一个<MyOpenLightDataElement> 元素并将其附加到文档(即网页)中。
    2. 它创建一个名为 MyOpenLightEvent 的事件,然后调度(运行)它。
    3. 该事件应该为 1 中的元素添加一个名为 reply 的属性,使其现在看起来像 <MyOpenLightDataElement reply="1">
    4. 如果可行(即安装了 OpenLight 并响应此类事件),该函数假定 OpenLight 已正确安装并返回 true,否则返回 false

    您的 Chrome 功能失败了,因为据我所知,ID GCOpenLightDataElement 从未附加到 DOM。您可能希望尝试使用原始函数,并将 catch 语句更改如下:

    catch(err) {
      alert(err);
    }
    

    我对 Chrome 的建议,它可能有效,也可能无效:

    function isOpenLightInstalled() {
        try
        {
            var element = document.createElement("GCOpenLightDataElement");
            document.documentElement.appendChild(element);
            var evt = document.createEvent("Event");
            evt.initEvent("GCOLCustomEvent", true, true);
            element.dispatchEvent(evt);
            if (element.getAttribute("reply") == "1")
            {
                return true;
            }
        }
        catch(err)
        {
            console.log(err); // just so we can see any errors with Ctrl+Shift+I
        }
        return false;
    }
    

    【讨论】:

    • 感谢您的回答。警告错误给了我:'TypeError: Cannot call method'dispatchEvent' of null'
    • 我得到了同样的结果,这就是我在最后一段中提到的。除非您的文档自动包含 ID 为 GCOpenLightDataElement 的元素,否则它将始终失败。我不使用 OpenLight,也不知道它的文档是什么样的,但我建议使用顶部的第一个函数,如有必要,将 MyOpenLight 替换为 GCOpenLight。除此之外,我认为我们需要更多关于您的文档外观的信息。
    • 原始函数是什么意思?我有点迷路了,这是我对 Chrome 的唯一功能:p
    • 我明白你的意思了......没有原创功能,我认为每个浏览器都有一个......
    • 对,我只是认为他们把 Chrome 搞砸了,你的检测功能需要添加创建自己元素的 Firefox 代码部分。请参阅我上面的编辑。我不能保证它会起作用,但是如果没有在我面前记录这些元素应该如何工作的东西,我只能猜测。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-18
    • 2013-06-04
    • 2020-09-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多