【问题标题】:show/hide without framework无框架显示/隐藏
【发布时间】:2011-03-11 04:29:51
【问题描述】:

搜索一个脚本,它可以在没有框架的情况下显示/隐藏功能。

类似:

<span rel="toggle" href="/somelink.html">Title</span>
<div class="toggle">Hidden block</div>

.toggle { display: none; }

点击span后应该会显示块.toggle。就像 jQuery 上的 toggle()

谢谢。

【问题讨论】:

  • 啊,您在我发布答案时添加了新要求,表明没有内联。我将使用不使用任何内联 javascript 的解决方案更新我的答案。
  • @galambalazs 我无法回答 Happy,但 HTML 是一种显示技术,实际上不应该在其中包含逻辑。因此,理想情况下,JavaScript 不应该在 HTML 中内联。浏览器可以很好地处理内联 JS,只是它违背了 HTML 的显示/语义概念。此外,可能存在阻止使用内联 HTML 的技术限制。也就是说,我通常可以内联简单的 JS,而不是编写事件侦听器或使用框架。
  • 内联 javascript 无效
  • 有什么技术限制? href="OnClick(do_something)" 和 onclick="" 是不同的顺便说一句...
  • 在什么意义上无效?

标签: javascript toggle show-hide


【解决方案1】:

首先,有一个函数可以为你给它的任何元素创建一个独特的切换函数。然后,我们等待窗口加载,当它加载时,我们创建一些切换函数。在这个例子中,我们假设你有一个 id='some_id' 的元素,但是你可以使用任何你需要的东西来获取一个元素。然后,我们将切换函数粘贴到一个全局变量中。

// 返回一个切换给定元素的函数 函数 makeToggleFunction(el) { 变量元素 = el; 返回函数(){ if (element.style.display == 'none') element.style.display = '块'; 别的 element.style.display = '无'; }; } window.addEventListener('load', on_window_load, false); 变量全球 = {}; 函数 on_window_load() { GLOBAL.toggle_element = makeToggleFunction(document.getElementById('some_id')); }

然后,您可以随时使用GLOBAL.toggle_element() 切换元素。

另外,如果你想等待页面加载,我认为这是 IE 的代码。

document.addEventListener("DOMContentLoaded", on_window_load, false);

编辑:

添加此功能(来自 http://www.dustindiaz.com/getelementsbyclass/ 由 programatique 提及)

函数getElementsByClass(搜索类,节点,标签){ var classElements = new Array(); 如果(节点==空) 节点=文档; 如果(标签==空) 标签 = '*'; var els = node.getElementsByTagName(tag); 变量 elsLen = els.length; var pattern = new RegExp("(^|\\s)"+searchClass+"(\\s|$)"); 对于 (i = 0, j = 0; i

然后在函数on_window_load内添加以下内容:

GLOBAL.toggleable = new Array(); 或每个(getElementsByClass('toggle')中的var元素){ GLOBAL.toggleable.push(makeToggleFunction(element)); } GLOBAL.toggle_all = function() { 对于每个(GLOBAL.toggleable 中的 var f){ f.call(); } };

现在你可以调用GLOBAL.toggle_all(),它会隐藏所有具有toggle类的元素。

【讨论】:

    【解决方案2】:

    这使用隐藏块上的 id 来确定要切换的 div。这是假设您希望每个可点击范围切换一个块。事件监听器方法是 W3C 标准,但我不确定 IE 是否实现它 - 做一些测试以确定。

    HTML:

    <!-- the rel attribute in the span specifies which div to toggle -->
    <span rel="target" id="trigger">Title</span>
    
    <div id="target">Hidden block</div>
    

    JavaScript,位于 HEAD 中的脚本块或单独的 .js 文件中:

    window.addEventListener('load', init, false);
    
    function init() {
        document.getElementById('trigger').addEventListener(
            'click',
            function() {
                targetId = this.getAttribute('rel');
                var element = document.getElementById(targetId);
                if (element.style.display == 'block')
                    element.style.display = 'none';
                else
                    element.style.display = 'block';
            },
            false
        );
    }
    

    那里,您的 HTML 中没有 JS。

    【讨论】:

    • 顺便说一句,如果您有多个可点击的跨度,您可以为每个跨度分配一个类,如“触发器”。然后在 init() 函数中,将事件侦听器注册放在一个循环中,该循环将侦听器附加到具有“触发器”类的所有内容。
    • 很抱歉,css display 可以有更多的值,而不仅仅是 2:w3schools.com/css/pr_class_display.asp
    • 当然在 IE 中不行……唉。很高兴,如果您查看 jQuery 源代码,您可能会找到实现目标所需的代码。如果我记得的话,他们不得不输入一些丑陋的黑客代码才能让这种东西在 IE 中运行。坦率地说,你应该只使用内联 JS 或使用像 jQuery 这样的库,它可以让你在没有内联 JS 的情况下做到这一点,因为他们已经为你完成了所有丑陋的 IE 兼容性代码。
    【解决方案3】:

    我将创建两个方法来使用原生 JavaScript 添加/删除 toggle 类:

    function show(element) {
        element.className += " toggle";
    }
    
    function hide(element) {
        element.className = (element.className).replace(/\s*toggle/g, "");
    }
    

    您需要将onclick 事件置于跨度上的代码。你熟悉吗?

    【讨论】:

    • 也许,/\s*toggle/g 以防没有前导空格并将其替换为空格字符?
    • 不允许内联javascript
    • @tvanfosson,如果您可靠地使用show/hide,则不会发生这种情况。尽管如此,我已经更新了代码,因为它仍然是一个好主意。 @Happy,它不是内联的。把它和你的其他 JavaScript 放在一起。
    【解决方案4】:

    See it in action.

    HTML

    <span rel="hidden" href="/somelink.html" onclick="toggle(this)">Title</span>
    <div class="toggle" id="hidden">Hidden block</div>
    

    Javascript

    function toggle(el) {
      if (!el.getAttribute("rel")) return;
      el = document.getElementById( el.getAttribute("rel"));
      var cname = " " + el.className + " ";
      if (cname.indexOf("toggle") !== -1) {
        cname = cname.replace(" toggle ", " ");
        el.className = cname.substring(1, cname.length-1);
      } else {
        el.className += " toggle";
      }
    }
    

    【讨论】:

    【解决方案5】:

    在这里创建一个 getElementByClass 函数 - http://www.dustindiaz.com/getelementsbyclass/

    然后是这样的(没有检查它是否有效,但你明白了):

    toggleItem = function(){
      var item = getElementByClass('toggle')[0];
      if (item.style.display == "block")
      {
        item.style.display = 'none';
      }
      else
      {
        item.style.display = 'block';
      }
    }
    

    【讨论】:

    • 的 onclick 事件怎么样?
    • 如上例,直接使用&lt;span onclick="toggleItem();"&gt;
    • 有什么办法不使用内联javascript?
    • quirksmode.org/blog/archives/2005/10/_and_the_winner_1.html 这向您展示了一些跨浏览器附加/分离事件处理程序的功能。在页面加载时附加事件,可以避免内联js。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-08-11
    • 1970-01-01
    • 2021-01-14
    • 2019-07-07
    • 1970-01-01
    • 2013-02-10
    • 2013-01-20
    相关资源
    最近更新 更多