Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/432.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 原型事件。IE的停止播放>;=8._Javascript - Fatal编程技术网

Javascript 原型事件。IE的停止播放>;=8.

Javascript 原型事件。IE的停止播放>;=8.,javascript,Javascript,我了解处理事件的正确方法。IE的停止播放是 if(event.stopPropagation) { event.stopPropagation(); } else { event.returnValue = false; } 但是,是否有可能对事件进行原型化,这样我就不必每次使用stopPropagation时都进行检查 这个问题似乎很有帮助:但是我不太理解被接受的答案,也不太理解它是如何成为一个基本上可以设置和遗忘的原型。可能是这样的: Event = Event || wi

我了解处理事件的正确方法。IE的停止播放是

if(event.stopPropagation) {
    event.stopPropagation();
} else {
    event.returnValue = false;
}
但是,是否有可能对事件进行原型化,这样我就不必每次使用stopPropagation时都进行检查

这个问题似乎很有帮助:但是我不太理解被接受的答案,也不太理解它是如何成为一个基本上可以设置和遗忘的原型。

可能是这样的:

Event = Event || window.Event;
Event.prototype.stopPropagation = Event.prototype.stopPropagation || function() {
    this.cancelBubble = true;
}
returnValue=false
与默认值类似:

Event.prototype.preventDefault = Event.prototype.preventDefault || function () {
    this.returnValue = false;
}

如果您正在用普通javascript进行自己的事件处理,那么您可能已经有了一个用于设置事件处理程序的跨浏览器例程。您可以将抽象放在该函数中。下面是我使用的一个模拟jQuery功能的函数(如果事件处理程序返回
false
,那么
stopPropagation()
preventDefault()
都会被触发。显然,您可以根据需要对其进行修改:

// refined add event cross browser
function addEvent(elem, event, fn) {
    // allow the passing of an element id string instead of the DOM elem
    if (typeof elem === "string") {
        elem = document.getElementById(elem);
    }

    function listenHandler(e) {
        var ret = fn.apply(this, arguments);
        if (ret === false) {
            e.stopPropagation();
            e.preventDefault();
        }
        return(ret);
    }

    function attachHandler() {
        // normalize the target of the event
        window.event.target = window.event.srcElement;
        // make sure the event is passed to the fn also so that works the same too
        // set the this pointer same as addEventListener when fn is called
        var ret = fn.call(elem, window.event);   
        // support an optional return false to be cancel propagation and prevent default handling
        // like jQuery does
        if (ret === false) {
            window.event.returnValue = false;
            window.event.cancelBubble = true;
        }
        return(ret);
    }

    if (elem.addEventListener) {
        elem.addEventListener(event, listenHandler, false);
    } else {
        elem.attachEvent("on" + event, attachHandler);
    }
}
或者,您可以创建如下实用程序函数:

function stopPropagation(e) {
    if(e.stopPropagation) {
        e.stopPropagation();
    } else {
        e.returnValue = false;
    }    
}

只需调用该函数,而不是对每个函数中的事件进行操作。

我们可以单独使用它:
event.cancelBubble=true


测试在所有浏览器中都能工作。

在另一个问题中,我发布了一个海报链接,其中提到了此方法,但接受了不同的答案。他提到它不能通过JSFIDLE工作。这就是为什么我关心此方法…我很清楚…当使用fn.call时,实际上不是启动传递到事件handl中的函数吗呃?我不知道它是如何或为什么返回false的?如果事件处理程序没有使用event.stopPropagation怎么办?还有一件事。我从未见过return使用括号。出于好奇,这与return ret有什么不同?@ryandlf-yes fn.call正在调用自定义事件处理程序函数(与
addEvent()
一起传入的,用于安装事件处理程序。如果要
stopPropagation())
特定事件,则在事件处理程序函数中
返回false
。如果不返回,则不返回。由事件处理程序函数决定是否停止传播。这是jQuery使用的模型。@ryandlf
返回false
返回(false)没有区别
。在多行语句的情况下,需要使用参数来确保JS解释器正确执行。通常情况下,
return
语句不需要使用参数。因此,对于我已经编写的每个事件处理程序,我必须返回并删除e.stopPropagation()而是使用return false,它将同时调用stopProp和preventDefault?换句话说,有必要在事件处理程序函数中显式地不调用这些函数,否则它将在跨浏览器时失败?