相关疑难解决方法(0)

JavaScript 中默认的事件顺序是什么?自上而下还是自下而上?

可能的重复:
什么是事件冒泡和捕获

我刚刚了解到,在 JS 中我们有两种事件类型:Capture 和 Bubble。eventListener泡泡可以用来避免所有孩子都需要依附;相反,仅将侦听器附加到父级并让它检查目标。听起来很酷。我尝试了这个例子:

<div id="parent-list">
    <span>span1</span>
    <span class='target'>span2</span>
    <span>span3</span>
    <span>span4</span>
</div>

<script type="text/javascript">
document.getElementById('parent-list').addEventListener('click',function(e){
    if( e.target && e.target.nodeName=='SPAN' ){
        var classes = e.target.className.split(' ');
        for(var i=0; i<classes.length; ++i){
            if( classes[i]=='target' ){
                alert('Bingo! you hit the target.');
            }
        }
    }
});
</script>
Run Code Online (Sandbox Code Playgroud)

但我还没有将任何侦听器附加到子跨度上。然而他们身上发生的事件却正在冒泡!那么冒泡是JS中默认的事件顺序吗?那么什么情况下会使用捕获(自上而下)呢?

javascript event-bubbling dom-events

5
推荐指数
1
解决办法
7320
查看次数

将点击事件存储在正文或单个元素组上是否更有效

我读了以下内容:

"如果用户可以与页面上的许多元素进行交互,则向每个元素添加事件侦听器可能会占用大量内存并降低性能......

...因为影响包含元素的事件可以将事件处理程序放在包含元素上,并使用事件目标属性来查找事件发生在哪个子节点上"

那么,在主体上执行一次单击事件然后委派正确的函数有什么缺点呢?

我在这里有一个例子:http://jsfiddle.net/jkg0h99d/3/

死锁的代码备份:

HTML:

<div id="test" class="box">gfdgsfdg </div>
<div id="test2" class="box">gfdsgfdsg</div>
<div id="test3" class="box">fdsgfdsgg</div>
<ul id="test4" class="box">
    <li id="test5" class="box">fsgfdsg</li>
    <li id="test6" class="box">gfdsgfds</li>
    <li id="test7" class="box">gfdsgfds</li>
    <li id="test8" class="box">gfdsgfds</li>
</ul>
Run Code Online (Sandbox Code Playgroud)

JS:

var body = document.body;

if (body.addEventListener) {
    body.addEventListener('click', function (e) {
        delegate(e, "click");
    }, false);
} else {
    body.attachEvent('onclick', function (e) {
        delegate(e, "click");
    }, false);
}


function delegate(e) {
    var sourceNode = e.target || e.srcElement;
    var id = sourceNode.id;
    switch (id) { …
Run Code Online (Sandbox Code Playgroud)

javascript

5
推荐指数
1
解决办法
589
查看次数

如何捕获 stopPropagation 的事件

例如,我们有一个带有链接的页面,上面有onclick事件侦听器。但是处理程序使stopPropagation. click如果不再冒泡到root,我该如何处理该事件?

例如

document.addEventListener('click', function(e) {console.log(e);});
a.onclick = function(e) {e.stopPropagation();};
Run Code Online (Sandbox Code Playgroud)

javascript dom-events stoppropagation

5
推荐指数
1
解决办法
1736
查看次数

突出表行

我有一个动态构建的表,最终得到以下代码(带有示例值):

<table id="patientTable" class="display" cellspacing="0" width="100%">
    <thead id="TableHeader">
        <tr>
            <th>Value1</th>
            <th>Value2</th>
            <th>Value3</th>
        </tr>
    </thead>
    <tbody id="tableContent">
        <tr class="clickable row_0" onclick="selectPatient(10001);" id="10001" style="background: #FFF;">
            <td class="tableContent">Value1</td>
            <td class="tableContent">Value2</td>
            <td class="tableContent">Value3</td>
        </tr>
    </tbody>
</table>
Run Code Online (Sandbox Code Playgroud)

我正在尝试使用以下CSS突出显示已经悬停的行:

.clickable :hover {
        background-color: #CCC;
    }
Run Code Online (Sandbox Code Playgroud)

出于某种原因,这会改变" <td>"元素的背景,例如,只会突出显示Value1,Value2或Value3而不是整行.

我试过(无济于事)使用:

.clickable tr:hover {
    background-color: #CCC;
}
.clickable:hover {
    background-color: #CCC;
}
.tr:hover {
    background-color: #CCC;
}
.tr :hover {
    background-color: #CCC;
}
Run Code Online (Sandbox Code Playgroud)

我发现这种不寻常的行为,因为它似乎适用于我见过的每一个其他例子.

值得注意的是:该表是从一个复杂的系统构建的,它基本上执行一个AJAX请求,执行PHP数据库查询,获取值,将它们抛入JSON数组,将它们传递回JS,将数组重新解析为JSON ,循环并创建表,然后输出它.JS会引起这个问题吗?

类名".clickable","row_#"(其中#是一个数字)和表行的ID需要保留,因为它们在将来的函数中使用,并为我提供了一种单独标识每一行的方法.

javascript css

5
推荐指数
1
解决办法
72
查看次数

mouseenter和append不好用

我需要mouseenter当前div将一些文本附加到div而不是工作好有时显示有时没有这里是小提琴的例子

码:

$(document).ready(function() {

  var thmb_wrap = $('.thm-img');
  var thumb = $('.thm-img img');
  var outer = $('.mn-img');
  var full = $('.mn-img img').length;
  var sc_height = $(outer).height();


  thmb_wrap.one('mouseenter', function() {

    var cur_im = $('.thm-img img').index($(this).children('img')) + 1;
    $(this).append('<span class="numeric">' + cur_im + '/' + (full) + '</span>');

  });

  thmb_wrap.on('mouseenter', function() {
    $(this).children('.numeric').stop().fadeIn(0);
  });

  thmb_wrap.on('mouseout', function() {
    $('.numeric').stop().fadeOut(0);
  });

  $(thumb).mouseenter(function() {

    var images = $('.thm-img img'); // get images

    // move mouseover onto actual images otherwise you won't know …
Run Code Online (Sandbox Code Playgroud)

javascript jquery

5
推荐指数
1
解决办法
79
查看次数

禁用外部库设置的事件侦听器

在外部库的某个地方(当然,我无法更改),以这种方式创建了一个事件侦听器:

someElement.addEventListener('keydown', function(e) {
    whatever();
});
Run Code Online (Sandbox Code Playgroud)

我需要摆脱这个监听器或以某种方式覆盖它。但似乎无法做到,因为我没有任何方法可以引用使用的匿名函数。

这不是唯一被删除的侦听器。卸下所有keydown听众会也行,如果有可能。

我已经看到一个选项是克隆元素并替换它,但我不能这样做,因为有很多初始化,并且创建了很多其他事件侦听器。我只需要取消那个keydown

有什么我可以做的吗?

javascript

5
推荐指数
1
解决办法
472
查看次数

Vue将@click属性传播给它的所有子节点,这是意外和奇怪的

我已经设置了这个菜单.然后,我有方法openMenu,closeMenuclickMenu.

<li class="nav-item dropdown" 
  v-on:mouseenter="openMenu" 
  v-on:mouseleave="closeMenu" 
  v-on:click="clickMenu">

  <a href="#demo" class="nav-link dropdown-toggle">DEMO</a>
  <ul class="dropdown-menu">
    <li class="dropdown-item"><a href="#">Demo 1</a></li>
    <li class="dropdown-item"><a href="#">Demo 2</a></li>
  </ul>
</li>
Run Code Online (Sandbox Code Playgroud)

当我调查发生了什么时,我注意到点击并将主菜单鼠标按预期工作.但是,似乎子菜单中的锚点也会对点击事件做出反应.我没有在其他地方设置任何听众.实际上,当我删除@click顶部的表单时,子菜单停止注册单击.

所以肯定是爸爸菜单传播甚至听孩子们!太意外了......

然后,我尝试了其他事件.你不知道吗?那些表现完全符合预期.根本没有传播徘徊事件.

这是一个错误吗?如何举报?

(如果它是一个特征,那么它是有史以来最愚蠢的一个.)

我知道这没关系,但我可以打赌我的驴子,像我这样震惊的人会认为它是超级基本的东西,并要求脚本的代码.问题存在,但由于我是一个如此灵活的人,这里是.

methods: {
  openMenu: (event) => { debugger; },
  closeMenu: (event) => { debugger; },
  clickMenu: (event) => { debugger; }
}
Run Code Online (Sandbox Code Playgroud)

javascript events vue.js

4
推荐指数
1
解决办法
2368
查看次数

react:onClick-只获取被点击的元素,而不是子元素

我有一个按钮,在此按钮内是一个非常棒的svg。侦听器仅在按钮上,而不在svg上。但是,当我单击svg时,event.target不是按钮。

但是我只需要按钮作为目标。

这是代码:

const icon = '<svg aria-hidden="true" data-prefix="fas" data-icon="paragraph" class="svg-inline--fa fa-paragraph fa-w-14 " role="img" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><path fill="currentColor" d="M408 32H177.531C88.948 32 16.045 103.335 16 191.918 15.956 280.321 87.607 352 176 352v104c0 13.255 10.745 24 24 24h32c13.255 0 24-10.745 24-24V112h32v344c0 13.255 10.745 24 24 24h32c13.255 0 24-10.745 24-24V112h40c13.255 0 24-10.745 24-24V56c0-13.255-10.745-24-24-24z"></path></svg>';

class App extends React.Component {
  constructor(props) {
    super(props);
  }

  handleClick(event) {
    event.stopPropagation();
    console.log(event.target);
  }

  render() {
    return (
      <div>
        <button onClick={this.handleClick}>
          <span dangerouslySetInnerHTML={{__html: icon}} />
        </button>
      </div> …
Run Code Online (Sandbox Code Playgroud)

javascript reactjs

4
推荐指数
1
解决办法
1825
查看次数

HTML5 拖放放置区

我在拖放方面遇到问题。

\n\n

我的问题是,当一个元素被放入 dropzone 时,它​​有时会被插入到另一个元素中,而不是 dropzone div 中。

\n\n

jsFiddle: http: //jsfiddle.net/kMbPF/

\n\n

在示例中,您可以看到我将表格做得很大,这样就很容易看到这一点。当一个表被拖放到另一个表的顶部时,它不会与其他元素一起进入拖放区,而是被插入到另一个表的内部。

\n\n

我有几个想法,但我不知道它们是否可行。其中之一是是否可以在放置区上插入一个大的 div,以确保元素始终放入其中。我将其视为几乎透明的层,它捕获元素然后将它们放置在放置区域中。

\n\n

我的另一个想法是尝试从 div 获取所有数据,将其全部放入一个字符串中,并尝试解析它,然后将所有数据替换回拖放区。

\n\n

您还会注意到,排序可以工作,但似乎只在 Firefox 中有效,而在 Safari 中则无效。这不是我最紧迫的问题,但如果您确实看到了一个修复程序,那就太好了!(排序仅适用于上部拖放区)我不想使用 jQuery。

\n\n

代码:

\n\n
<!DOCTYPE html>\n\n<html lang="en">\n<head>\n    <title>Basic drag and drop example</title>\n\n    <style>\n    @CHARSET "UTF-8";\ntable.draggable-word {\n    background-color: red;\n    padding: 0px;\n    border: 1px solid green;\n    -webkit-touch-callout: none;\n    -webkit-user-select: none;\n    -khtml-user-select: none;\n    -moz-user-select: none;\n    -ms-user-select: none;\n    user-select: none;\n    border-collapse: collapse;\n    border-spacing: 0;\n    padding: 0;\n    margin: 0;\n    line-height: 1;\n    width: 100%;\n    height:50px;\n}\n\n.drop-div {\n    width: 150px;\n    height: …
Run Code Online (Sandbox Code Playgroud)

html javascript css php drag-and-drop

3
推荐指数
1
解决办法
4487
查看次数

Jquery点击子元素触发点击父元素

我有类似的:

<ul>
<li class="parent">
<div class="child"></div>
</li>
</ul>
Run Code Online (Sandbox Code Playgroud)

我有两个点击触发器。

$(document).on("click", ".parent", function(){
console.dir("parent clicked");
});

$(document).on("click", ".child", function(){
console.dir("child clicked");
});
Run Code Online (Sandbox Code Playgroud)

如果我点击孩子,父母也会被点击!我如何避免这种情况?

http://jsfiddle.net/Vd2GA/

javascript jquery

3
推荐指数
1
解决办法
3635
查看次数