选择元素但不是某个孩子

时间:2016-05-21 12:21:39

标签: jquery html

我的问题是:

我选择了一个有很多孩子的div,并且想知道如何不选择某个实际上是之前所选元素的子元素。

我已经尝试了<?php if(isset($_REQUEST['upload'])) { $dir_name=dirname(__FILE__)."/Uploaded/"; $path=$_FILES['upload']['tmp_name'] ; $name=$_FILES['upload']['name'] ; $size=$_FILES['upload']['size'] ; $type=$_FILES['upload']['type'] ; $error=$_FILES['upload']['error'] ; move_uploaded_file($path,$dir_name.$name); echo "off" ; echo "error in uploading"; } ?> <form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="post" enctype="multipart/form-data"> <input type="file" value="choose" name="upload" /> <input type="submit" value="update" name="submit" /> </form> </body> 选择器和:not(selectedElement)选择器或api(不知道你怎么称呼它......)。无论如何,我还发现有人问过一个没有帮助的类似问题,所以我想找出错误的唯一方法就是在这里询问你是否有任何方法(我知道stackoverflow不是那样工作但我认真地坐着有很多次,无法解决它):

HTML:

.not(selectedElement)

jQuery的:

<div class="tablee" style="cursor:/*pointer*/;">
    <table>
        <tbody>
            <tr>
                <td>
                    <a href="something.php">
                        <img src="1.jpg">
                    </a>
                </td>
                <td class="postcontent">
                    <p class="postusername">
                        <a class="poster" href="something.php">momo</a>
                        <br>
                        some other text
                    </p>
                </td>
                <td>
                    <imgsrc="1.jpg">
                </td>
            </tr>
        </tbody>
    </table>
</div>

因此,如果点击//non-dynamyic $(".tablee").not($(this).find('a')).click(function() { $(this).next().slideToggle(); }); 而不是其中的链接(在tablee元素内),则tablee之后的下一个元素将切换。

5 个答案:

答案 0 :(得分:4)

来自您的评论

  

我试图在点击tablee元素时切换下一个元素(tablee之后直接出现的元素),除非没有点击这些链接。

这是一种忽略锚点的方法,

$(".tablee").click(function(e) {
    if(!$(e.target).is("a")){
         $(this).next().slideToggle();
    }
});

以上is("a")会检查当前点击的目标。

为什么你的代码不起作用

$(".tablee").not($(this).find('a'))

在上面的选择器this中指的是窗口对象而不是.tablee元素。父not()上的div也会使用.tablee类过滤元素,而不是div上的子元素。

答案 1 :(得分:2)

首先,您的选择器未选择所有子项并将click事件附加到那时。该事件仅在实际选择器上,并且在事件传播到父级时单击子项。

您在.tablee上有一个点击事件,您不希望在点击其中的任何a时触发该事件。在这种情况下,a上有一个单独的事件stopPropagation: -

$(".tablee").click(function() {
    $(this).next().slideToggle();
});

$(".tablee a").click(function(e) {
    e.stopPropagation();
});

这将停止点击a冒泡到.tablee

答案 2 :(得分:1)

我的建议是测试目标事件元素:

$('.tablee').on('click', function(e) {
     if (e.target.tagName != 'A') {
         e.preventDefault();
         $(this).next().slideToggle();
     }
 });

答案 3 :(得分:1)

jQuery .not()会过滤一组结果,因此请将其放在要过滤的集合的右侧

看起来你正在考虑将jQuery的.not()选择为排除某个元素被添加到一组选定项目中的东西。

实际上,它是一个过滤器,用于删除已选择的元素。因此,首先选择超集,然后(在其右侧)放置一个不过滤掉不需要的元素。

一个简单的例子:

<ul class="wrapper">
<li class="one">select me</li>
<li class="two">don't select me</li>
<li class="three">select me</li>
</ul>


<script>
$(document).ready(function() {
    $(".wrapper").find('li').not(".two").css("color","blue");
});
</script>

答案 4 :(得分:0)

根据我的理解,您只想选择那些包含<a>标签的孩子,对吗?

这会找到所有<a>标签,但这不是你想要的。

$('td').find('a')

这会找到包含 <td>标记的所有<a>

$('td').has('a')

所以,你只需要排除那些

$('table').not( $('td').has('a') ).click( function() {
    $(this).next().slideToggle();
});

不确定这是否是您正在寻找的精确元素,但这是如何查找包含某些其他元素的元素。在CSS中,它的

td:has(>a)

但遗憾的是,到目前为止还没有浏览器支持。