javascript - 我可以阻止点击触发网站的常规操作吗?

标签 javascript twitter google-chrome-extension reactjs content-script

作为 React.js 的实验,我正在尝试构建一个 chrome 扩展,它使用内容脚本将输入字段(现在还有一个按钮)注入(inject)某些网站。在这种情况下,我试图将其注入(inject) Twitter。它看起来像这样: enter image description here 请注意,代码将按钮和输入放在文本下方,但结果相同

注入(inject)有效,但我实际上无法使用输入。我将该元素注入(inject)到主页上的推文中,当我点击输入框输入内容时,它会触发推文并展开或收缩。这会从输入中移除焦点,使其变得无用。我试图回调焦点 onBlurstopPropagation() onClick,但是 onClick 没有被触发并且我不确定如何使用 onBlur 恢复焦点。我怎样才能停止注意力不集中?

如果您想自己测试,react-with-addons.js 来自入门工具包 here

编辑: 我尝试将按钮添加到代码中以查看是否可以单击它,我可以。我可以点击它而不会触发推文本身。这意味着输入框的某些特定内容导致了问题,或者按钮中的某些内容阻止了点击的传播。 当您单击其他元素没有而推文可能有的输入字段时,是否会触发一些特殊的事情?

编辑 2: 我现在尝试将 stopPropagation 添加到包含的 div 并增加它的 z-index,它们都不会阻止它。

编辑 3: 我现在已经尝试使用 stopPropagation onMouseDown(以及 onMouseUp 和 onClick,同时进行),但没有成功。奇怪的是我之后尝试了 isPropagationStopped(),它返回 true。如果是这样,那为什么 Twitter 仍然被触发?

test_input.js

/**
 * @jsx React.DOM
 */
var Test_Input = React.createClass({
    maintain_focus: function(){
        e.stopPropagation();
        console.log("=====");
    },
    refocus: function(e){
        e.stopPropagation();
    },
    handle_click: function{
        console.log("clicked");
    }
    render: function(){
        return (<div>
                       <button onclick={this.handle_click}>
                       <input className="new_note_input" placeholder="Note" onclick={this.maintain_focus} onBlur={this.refocus}></input>
                   </div>);
    }
});
var elements_to_append_to = document.getElementsByClassName('content');
[].forEach.call(elements_to_append_to, function(element){
    var container = $("<span />");
    $(element).after(container);
    React.renderComponent(<Test_Input />, container[0]);
});

list .json

{
  "name": "Test Input",
  "version": "0.1",
  "manifest_version": 2,
  "permissions": ["tabs", "bookmarks", "declarativeWebRequest", "*://*/*"],
  "content_scripts": [
        {
            "matches": [ "https://twitter.com/*"],
            "css":["src/social_notes.css"],
            "js":[ "build/jquery-2.1.0.min.js", "build/react-with-addons.js", "build/test_input.js"]
        }
    ]
}

最佳答案

e.stopPropagation()适用于事件处理程序。由于输入字段点击触发默认行为,而不是 e.stopPropagation()e.preventDefault() 在输入中带有 return false;框点击处理程序应该可以解决问题。

在处理程序中,在返回 false 之前执行 $(this).focus();。这将使文本框保持焦点。

例如:

$(".inputField").on("click", function(e){
  e.preventDefault();
  $(this).focus();
  return false;
})

关于javascript - 我可以阻止点击触发网站的常规操作吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24153253/

相关文章:

javascript - 从 Chrome 本地存储中提取值未将值分配给局部变量

javascript - 单击 iFrame 中的按钮时如何关闭 jQuery 对话框?

javascript - 动画化迭代应用的宽度变化

javascript - gulp 间歇性地创建目标目录

javascript - 使用 JavaScript 设置的值不会保留在回发中

javascript - Chrome 扩展 - 修改 Google 日历事件 UI 以通过输入字段接受扩展属性

javascript - 试图弄乱示例扩展,但我的 JS 似乎不起作用

javascript - 像推特一样的评论框

java - 如何通过 jtwitter(twitter API)从 java applet 避免 java.security.AccessControlException

将 JSON 代码写入 txt 文件的 PHP 脚本缺少空格和换行符。怎么修?