在Android浏览器4.0.4的事件处理程序中,knockout.js 'ko'从页面中消失

ryevplcw  于 2022-11-10  发布在  Android
关注(0)|答案(1)|浏览(95)

我观察到非常奇怪的行为,当在三星平板电脑上测试系统时,一些链接停止工作。为了使调试更容易,我使用Chrome开发工具模拟器,当页面加载时,我可以从控制台调用kncoukout.js全局ko进行调试(如获取绑定元素的上下文...)事情是,当我试图从事件处理程序ko进行调试时消失了。
请看下面的截图。

我已经能够在不回叫时访问ko
然后我在事件处理程序中放置断点,并尝试在aclick上再次访问ko,但它不再存在,然后它失败,并显示错误ko不存在。
"怎么回事ko怎么会凭空消失"
我并不认为这有什么关系(任何事件处理程序都有同样的情况),但有人会要求提供使ko消失的代码。

var parseHrefBinding = function (link) {
        var newHref = null;
        var boundEl = $(link).closest('[data-bind]')[0];
        if (boundEl) {
            var data = ko.dataFor(boundEl);
            if (data) {
                var a = document.createElement('a');
                a.setAttribute('data-bind', link.attributes['data-bind'].value);
                ko.applyBindings(data, a);
                newHref = a.href;
            }
        }

        return newHref;
    };

    $(document).on("click", "a", function () {
        var res = true;
        var link = this;
        var parent = $(link).parents('a')[0];
        if (parent) {
            // The default Android browser (V2-4.1) sets nested a[href] to their parent's href.
            var href = parent.href === link.href ? parseHrefBinding(link) : link.href;
            setTimeout(function () {
                document.location.href = href;
            }, 10);
            res = false;
        }

        return res;
    });
0pizxfdo

0pizxfdo1#

上帝,这是史诗,原来,要在Android Browser 4上的事件处理程序中使用全局变量,必须在ko前面添加window,如window.ko,见下面的截图。

所以修复就像改变一样简单
var data = ko.dataFor(boundEl);

var data = window.ko.dataFor(boundEl);

相关问题