Document 对象属性和方法的不兼容问题

缺乏、安全感 2024-04-18 18:56 117阅读 0赞
  1. .bind不兼容的问题
    bind()方法主要就是将函数绑定到某个对象,bind()会创建一个函数,函数体内的this对象的值会被绑定到传入bind()第一个参数的值

    1. Function.prototype.bind = function () {
    2. var fn = this, args = Array.prototype.slice.call(arguments), object = args.shift();
    3. return function () {
    4. return fn.apply(object,
    5. args.concat(Array.prototype.slice.call(arguments)));
    6. };
    7. };
  2. .getElementsByClassName 不兼容的问题
    getElementsByClassName 方法可以获取具有指定class属性值的元素,返回值是一个集合。

    1. var getElementsByClassName = function (searchClass, node, tag) {
    2. var result = [];
    3. if (document.getElementsByClassName) {
    4. var nodes = (node || document).getElementsByClassName(searchClass);
    5. for (var i = 0; node = nodes[i++];) {
    6. if (tag !== "*" && node.tagName === tag.toUpperCase()) {
    7. result.push(node)
    8. }
    9. }
    10. return result
    11. } else {
    12. node = node || document;
    13. tag = tag || "*";
    14. var classes = searchClass.split(" "),
    15. elements = (tag === "*" && node.all) ? node.all : node.getElementsByTagName(tag),
    16. patterns = [],
    17. current,
    18. match;
    19. var i = classes.length;
    20. while (--i >= 0) {
    21. patterns.push(new RegExp("(^|\\s)" + classes[i] + "(\\s|$)"));
    22. }
    23. var j = elements.length;
    24. while (--j >= 0) {
    25. current = elements[j];
    26. match = false;
    27. for (var k = 0, kl = patterns.length; k < kl; k++) {
    28. match = patterns[k].test(current.className);
    29. if (!match) break;
    30. }
    31. if (match) result.push(current);
    32. }
    33. return result;
    34. }
    35. }
  3. addEventListener不兼容的问题
    addEventListener()的工作原理是将实现EventListener的函数或对象添加到调用它的EventTarget上的指定事件类型的事件侦听器列表中。

    1. function myAddEvent(obj, ev, fn) {
    2. if (obj.attachEvent) {
    3. obj.attachEvent("on" + ev, fn);
    4. }
    5. else {
    6. obj.addEventListener(ev, fn, false);
    7. }
    8. }
  4. .map不兼容的问题

    Array.prototype.myMap = function (fn, context) {

    1. context = context || window;
    2. var ary = [];
    3. if (Array.prototype.map) {
    4. ary = this.map(fn, context);
    5. } else {
    6. for (var i = 0; i < this.length; i++) {
    7. ary[i] = fn.apply(context, [this[i], i, this]);
    8. }
    9. }
    10. return ary;

    }

  5. e.stopPropagation的兼容性问题
    不再派发事件。
    终止事件在传播过程的捕获、目标处理或起泡阶段进一步传播。调用该方法后,该节点上处理该事件的处理程序将被调用,事件不再被分派到其他节点。

    1. function stopPropagation(){
    2. e = window.event || e;
    3. if (document.all) { //只有ie识别
    4. e.cancelBubble = true;
    5. } else {
    6. e.stopPropagation();
    7. }
    8. }
  6. e.currentTarget的兼容性问题修复如下:
    currentTarget 事件属性返回其监听器触发事件的节点,即当前处理该事件的元素、文档或窗口。
    在捕获和起泡阶段,该属性是非常有用的,因为在这两个节点,它不同于 target 属性。

    1. var userAgent = navigator.userAgent; //取得浏览器的userAgent字符串
    2. var isOpera = userAgent.indexOf("Opera") > -1; //判断是否Opera浏览器
    3. var isIE = userAgent.indexOf("compatible") > -1 && userAgent.indexOf("MSIE") > -1 && !isOpera; //判断是否IE浏览器
    4. if (isIE) {
    5. var reIE = new RegExp("MSIE (\\d+\\.\\d+);");
    6. reIE.test(userAgent);
    7. var fIEVersion = parseFloat(RegExp["$1"]);
    8. if (fIEVersion == 7 || fIEVersion == 8) {
    9. e=e.srcElement.parentElement;
    10. }else{
    11. e=e.currentTarget;
    12. }
    13. }else{
    14. e=e.currentTarget;
    15. }

发表评论

表情:
评论列表 (有 0 条评论,117人围观)

还没有评论,来说两句吧...

相关阅读