javascript - Paper 工具栏 javascript 没有反应

标签 javascript polymer

我有一个 polymer paper-toolbar具有一些自定义属性(例如背景颜色和标题)的元素。它含有 a.o.一个搜索按钮,并在各种其他元素中调用。 问题是,只有第一次调用它的元素在切换时才会显示搜索框,而在其他元素中则不会。

这是工具栏的代码:

<template>
    <paper-toolbar class$="{{toolbarSize}}" style$="background-color:{{toolbarColor}};">
      <span class="title"><p>{{topTitle}}</p></span>
            <div id="searchbox">
              <input-search placeholder="Search …"></input-search>
            </div>
            <paper-icon-button id="searchicon" icon="search" on-tap="openSearch"></paper-icon-button>

      <span class="middle title"><h1>{{middleTitle}}</h1></span>
      <span class="bottom title"><p class="subtitle">{{bottomTitle}}</p></span>
    </paper-toolbar>
</template>
<script>
    Polymer({
      is: 'tool-bar',
      properties: {
        topTitle: String,
        middleTitle: String,
        bottomTitle: String,
        toolbarSize: String,
        toolbarColor: String
      },
      openSearch: function() {
        var sb = document.getElementById("searchbox");
        console.log(sb);
        if (sb.hasAttribute("hidden")) {
          sb.removeAttribute("hidden");
        } else {
          sb.setAttribute("hidden", true);
        }
      }
    });
</script>

这是在其他各种元素中调用的代码:

<paper-scroll-header-panel>
 <div class="paper-header staticpage">
  <tool-bar
    toolbar-color="var(--sc-gold-500)" 
    toolbar-size="tall" 
    middle-title="Titletext" 
    bottom-title="Subtitle text">
  </tool-bar>
 </div>
 <page-view></page-view>
</paper-scroll-header-panel>

当我打开网站并单击搜索图标时,它确实可以很好地切换搜索框。但是,当我转到任何其他页面(调用具有不同属性的同一工具栏的不同元素)时,它不再切换工具栏。

在我看来,这就像一个错误,但如果有人对此行为有解决方案或解释,我将非常感激。我已经尝试过使用各种其他输入元素,并且具有相同的结果。

控制台.log 的输出: console.log 似乎表明一切都很好。

在第一页(元素正确隐藏/取消隐藏的位置): 第一次点击:<div id="searchbox" class="style-scope tool-bar" hidden="true"> 第二次点击:<div id="searchbox" class="style-scope tool-bar">

然后我移动到另一个页面/元素,它给出了完全相同的结果,除了元素没有隐藏,即使属性 hidden="true" 也是如此。 。然而,当我查看检查元素时,它没有显示属性 hidden="true" .

但是,当我单击它时,console.log 会显示 hidden="true" ,然后我回到第一页/元素,搜索框确实隐藏在第一页上。

最佳答案

由于 Polymer 基于 Shadow-DOM,标准 DOM 选择器(如 document.getElementById('someId') )不明智会导致意外结果。这是因为自定义元素会将重复的 ID 插入到 DOM 中。

要克服这个问题,您必须使用 Polymer 的元素选择器方法:Polymer.dom(this.root).querySelector('#someId') 。这可以方便地缩短为 this.$$.someId 。 (其中 this 是自定义元素)

修复

对于上面的代码,更改 openSearch函数如下:

openSearch: function() {
  this.toggleAttribute('hidden', true, this.$.searchbox);
}

谢谢@Kuba指出我最初的错误。

修复说明

元素选择

this.$是当前自定义元素 ( this ) 被标记到页面上时的元素 ID 对象。因此,this.$.searchbox获取this自定义元素的“searchbox”元素的元素句柄。这是与 document.getElementById(...) 相比,它只会获取第一个带有 id="searchbox" 的元素它在页面上找到的,不一定是属于当前自定义元素的。

属性切换

Polymer 为其自定义元素的元素句柄(来自 PolymerBase )添加了一些特殊方法。其中之一是 PolymerBase.toggleAttribute(String name [, Boolean value, Element node])方法(link to docs)。要将此方法与 polymer 元素一起使用,您可以在 this.$ 中的元素引用中调用它。或this.$$ .

对于自定义元素的元素,请使用:

  • this.toggleAttribute('hidden', true, this.$.someElementId)

如果目标元素是 polymer 加载的自定义元素,还可以使用:

  • this.$.someElementId.toggleAttribute('hidden')
  • this.$.someElementId.toggleAttribute('hidden', true)

附注:请将您的工具栏重命名为 vims-toolbar或类似的自定义元素命名方案 <namespace>-<element-name> .

进一步阅读: PolymerBase docs

关于javascript - Paper 工具栏 javascript 没有反应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43581115/

相关文章:

javascript - 如何按键对ng-options中的数组进行排序?

dart - 使用 Polymer-Dart 和 Dart 对象进行数据绑定(bind)

javascript - 如何使用javascript字符串/n字符

javascript - 禁止点击 anchor 标签下的 img 标签

jquery - 使用 JQuery 访问 Polymer 创建的 DOM

polymer - 未捕获的 DOMException : Failed to execute 'define' on 'CustomElementRegistry' (Polymer 2. 0)

polymer - 自定义元素填充 paper-scroll-header-panel 内容高度区域

polymer - 使用iron-meta 管理 Polymer 2.x 中的状态

javascript - Angularjs oauth 弹出窗口,等待 JSON 响应

javascript - 如何添加格式的图像?