jQuery优雅降级

时间:2008-11-21 06:55:49

标签: javascript jquery css backwards-compatibility

我想在这里和那里用一些jQuery动画修饰我的网站的某些区域,并且我希望完全替换我的AJAX代码,因为我的现有代码存在一些跨浏览器兼容性问题。但是,由于jQuery是一个JavaScript库,我担心当JavaScript关闭或用户浏览器中不存在时,我的页面无法正常运行。

我举一个例子:目前,我正在使用一个纯CSS工具提示来向我的用户(玩家,该网站是一个浏览器游戏)提供有关其他用户的信息。例如,如果游戏中的其他玩家满足一个或多个条件,则在其名称旁边显示目标图标,并且当将鼠标悬停在该目标图标上时,显示关于目标背后的原因的信息。这是有用的信息,因为它可以帮助我的玩家知道他们应该计划在游戏中接下来攻击谁。

目前,我使用CSS进行此类工具提示。我有一个父div,它包含类“info”的目标图标的图像。然后我在其中有一个div,其中包含类“tooltip”,它显示了包含在其中的“info”类的悬停状态,但是在正常状态下是隐藏的。当我读到它时,我认为这是相当聪明的,因为没有使用JavaScript,它适用于任何符合CSS的浏览器。

我想使用jQuery来达到同样的效果,主要是因为它看起来更干净,但也因为我相信快速和微妙的动画可以使这些“随机出现”的东西对用户更有意义,特别是在第一次遭遇。我只是想知道这两者是否会发生冲突。这只是其中的一个例子,还有许多其他例子,无法使用JavaScript会妨碍网站。

所以我想问的是,如何让jQuery网站在不支持JavaScript的浏览器上优雅地降级,但支持大多数CSS?我的目标是让网站在所有用户的基本级别上运行,无论选择何种浏览器。动画就是一个很好的例子,但是我也担心更多的动态比特,比如用AJAX自动更新等等。有没有什么好的资源可以实现这个目标,或者你对最好的方法有任何建议这种可降解性可以实现吗?

由于

PS:完全无关紧要,但Firefox似乎认为“降解性”不是一个词,而是“生物降解性”(带有“生物”前缀)。奇怪的...

3 个答案:

答案 0 :(得分:5)

如果您考虑css的“级联顺序”,您是否可以在所有先前的CSS定义的最后添加css样式以取消当前对工具提示效果的任何CSS效果?

只有在激活Javascript并检测到JQuery时才会声明该css规则。

这样,您确定css tooltip effect与您的JQuery效果不冲突。

类似的东西:

a.info:hover span{ display:none}

使用“js_enabled”类使这个css规则成为条件。

您也可以adding css rule on the fly

执行此操作
function createCSSRule(rule,attributes)
{
    //Create the CSS rule
    var newRule = "\n"+rule+"{\n";
    for (var attribute in attributes)
    {
        newRule += "\t" + attribute + ": " + attributes[attribute] + ";\n";
    }
    newRule += "}\n";

    //Inject it in the style element or create a new one if it doesn't exist
    styleTag = $E('style[type="text/css"]') || new Element("style").setProperty('type','text/css').injectInside(document.head);
    if(window.ie)
    {
        styleTag.styleSheet.cssText += newRule;
    }
    else
    {
        styleTag.appendText(newRule);
    }
}

Separation of CSS and Javascrip最简单的解决方案是删除您的css类

function jscss(a,o,c1,c2)
{
  switch (a){
    case 'swap':
      o.className=!jscss('check',o,c1)?o.className.replace(c2,c1): <-
      o.className.replace(c1,c2);
    break;
    case 'add':
      if(!jscss('check',o,c1)){o.className+=o.className?' '+c1:c1;}
    break;
    case 'remove':
      var rep=o.className.match(' '+c1)?' '+c1:c1;
      o.className=o.className.replace(rep,'');
    break;
    case 'check':
      return new RegExp('\\b'+c1+'\\b').test(o.className)
    break;
  }
}

此示例函数有四个参数:

a
    定义您希望函数执行的操作 o
    有问题的对象。
c1
    第一类的名字
c2
    第二类的名称

可能的行动是:

swap
    用对象o中的类c2替换类c1 add
    将类c1添加到对象o remove
    从对象o中删除c1类 check
    测试类c1是否已应用于对象o并返回true或false。

答案 1 :(得分:1)

如果可以在CSS中完成某些事情,我说保持这种方式。如果浏览器中缺少javascript是一个问题,那么大多数时候我会显示整个页面不受影响。

比如说,当点击一个复选框时,我将使用jQuery来切换一个元素。在页面加载时,我查看复选框并相应地更新元素。如果未启用javascript,则元素仍将显示,并且该网站仍可使用。只是不那么好。

答案 2 :(得分:0)

伙计,你有一个基于浏览器的游戏,对吧?禁用js的用户不到1%!并且1%是世界末日的数字,因为我可以下注,你的数量少于那个;)

无论如何,如果你真的关心这个,那就去做一个没有任何javascript的网站。并使其功能100%。在您的网站完全没有任何js风格的情况下,只需开始使用jquery(或任何其他库)进行改进; jquery是最好的:P)。但要小心:不要改变任何你的HTML。它比它看起来容易;)

是的,如果你的东西在没有js的情况下运行(比如那些工具提示),请保留它!