javascript - 如何捕获动态更改的选择上的事件

标签 javascript html timeout

我有一个脚本,它创建一个 span 来假定 select 标签,然后隐藏 select。这允许更简单的 CSS 样式设置,因为相对于坚定的 select 标记,我可以更轻松地设置 span 样式。使用跨度,我有一个下拉列表,它是 ul 标签,问题是,当我在“假选择”上选择一个值并使用 javascript 使其成为隐藏的“真实”选择的值时, onchange 未触发。这样做的目的是帮助那些想要样式选择的“非技术人员”,因此我想捕获他们添加到选择的任何事件,例如 onchangeonfocusonreset

例如,在下面的代码中,如果您手动选择该选项,则会触发 onchange 事件,而 timeout 函数不会触发该事件

    <script>
        var select = document.getElementsByTagName('select')[0];

        function changed() {
            var select = document.getElementsByTagName('select')[0];
            select.value = 'that is optionification fam!';
        }

        setTimeout(changed, 1000);
    </script>
    <select onchange="alert('Object has changed!')">
        <option value="">Select an Option</option>
        <option>this is option</option>
        <option>that is optionification fam!</option>
        <option>these are options</option>
        <option>those a options</option>
        <option>I like options</option>
        <option>I don't like options</option>
        <option>this is an option</option>
    </select>

更新:

来自W3C :

Events that are generated by the user agent, either as a result of user interaction, or as a direct result of changes to the DOM, are trusted by the user agent with privileges that are not afforded to events generated by script through the DocumentEvent.createEvent("Event") method, modified using the Event.initEvent() method, or dispatched via the EventTarget.dispatchEvent() method. The isTrusted attribute of trusted events has a value of true, while untrusted events have a isTrusted attribute value of false.

Most untrusted events should not trigger default actions, with the exception of click or DOMActivate events. These events trigger the default action of an activation trigger (see Activation triggers and behaviors for more details); these untrusted events have an isTrusted attribute value of false, but still initiate any default actions for backwards compatibility. All other untrusted events must behave as if the Event.preventDefault() method had been called on that event.

由于 isTrusted 也是一个只读属性,因此任何脚本化更改都是“一成不变的不可信”...这就是问题所在!

任何人都可以想到解决办法吗?我可以在哪里

  • 创建“假”/人为事件响应
  • 或使用用户的输入更改选择的值**

最佳答案

注意,首先<script> block select没有定义。使用load事件window定义select元素。一种解决方法是使用 Document.createEvent() "MouseEvents"作为参数, MouseEvent.initMouseEvent() (已弃用) "change"作为第一个参数,true , true , window作为接下来的三个参数, EventTarget.dispatchEvent() 链接到select window 中定义的变量load要调度的事件 change事件至<select>元素。

另请参阅Trigger click on input=file on asynchronous ajax done() .

<script>
  function changed() {
    var select = document.getElementsByTagName("select")[0];
    select.value = "that is optionification fam!";
    alert("Object has changed!");
  }

  window.onload = function() {
    let evt = document.createEvent("MouseEvents");
    const select = document.getElementsByTagName("select")[0];
    evt.initMouseEvent("change", true, true, window);
    setTimeout(function() {
      select.dispatchEvent(evt);
    }, 3000);
  }
</script>
<select onchange="changed()">
  <option value="">Select an Option</option>
  <option>this is option</option>
  <option>that is optionification fam!</option>
  <option>these are options</option>
  <option>those a options</option>
  <option>I like options</option>
  <option>I don't like options</option>
  <option>this is an option</option>
</select>

使用CustomEvent支持 chrome、firefox 6+、ie9+、opera 11+、safari 5.1+ (533.3); EventTarget.dispatchEvent() .

<script>
  function changed() {
    var select = document.getElementsByTagName("select")[0];
    select.value = "that is optionification fam!";
    alert("Object has changed!");
  }

  window.onload = function() {
    let evt = new CustomEvent("change");
    const select = document.getElementsByTagName("select")[0];
    setTimeout(function() {
      select.dispatchEvent(evt);
    }, 3000);
  }
</script>
<select onchange="changed()">
  <option value="">Select an Option</option>
  <option>this is option</option>
  <option>that is optionification fam!</option>
  <option>these are options</option>
  <option>those a options</option>
  <option>I like options</option>
  <option>I don't like options</option>
  <option>this is an option</option>
</select>

关于javascript - 如何捕获动态更改的选择上的事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41435270/

相关文章:

javascript - 滑动事件未触发

javascript - HTML5 捕获和保存视频

java - 数据报套接字 setSoTimeout

timeout - Cassandra 频繁读写超时

javascript - 使用 CSS、JavaScript 或 jQuery 在鼠标悬停时更改字词?

javascript - javascript 中的正则表达式每隔一次都会因相同的输入而失败

javascript - 使用 JQuery 的 nicEditor 和 onchange 事件

javascript - 检查左键或右键单击的指针事件方法

HTML 表格边框现在显示在 asp.net mvc 3 View 中

session - 如何增加 Symfony 中的 session 超时