如何使用其父类选择器将 HTML 图像标签与 Javascript 交换?

Posted

技术标签:

【中文标题】如何使用其父类选择器将 HTML 图像标签与 Javascript 交换?【英文标题】:How to swap HTML image tags with Javascript using class selector of its parent? 【发布时间】:2017-05-27 05:23:22 【问题描述】:

我有以下几行由 php 插件脚本生成的 html 代码,我不想直接修改(出于将来升级兼容性的目的)。

<div id="post-ratings-1981" class="post-ratings" data-nonce="0ab2fb33f4">

<img id="rating_1981_1" src="./rating_1_on.gif"  title="Down" onmouseover="current_rating(1981, 1, 'Down');" onmouseout="ratings_off(2.5, 3, 0);" onclick="rate_post();" onkeypress="rate_post();" style="cursor: pointer; border: 0px;" />

<img id="rating_1981_2" src="./rating_2_on.gif"  title="Up" onmouseover="current_rating(1981, 2, 'Up');" onmouseout="ratings_off(2.5, 3, 0);" onclick="rate_post();" onkeypress="rate_post();" style="cursor: pointer; border: 0px;" />

</div>

基本上它会输出一个不赞成和赞成的投票图标。

我想交换输出位置,使其先显示竖起大拇指图标,然后显示大拇指向下,这样更符合逻辑。

我发现如果我不能直接修改控制输出的PHP脚本代码,并且post-id是动态生成的,是否可以使用class="post-ratings"通过javascript选择器来完成?

这如何通过 Javascript 或 jQuery 实现?

PS:在给定的列表页面上,我可能有多个上述&lt;div&gt; 块和class="post=ratings"

【问题讨论】:

position: relative 放在div 上,将position: absolute 放在img 元素上。然后,您可以根据需要在 CSS 中交换他们的 left 位置。但是,我强烈建议您在 PHP 源代码中执行此操作,因为您可以访问它,并且还考虑使用不显眼的 JS 事件处理程序,而不是丑陋和过时的 on* 事件属性。 div 是硬编码在 php 脚本中的,我无法修改。 那你就可以使用我提到的CSS方法了。但是我不明白为什么你不能修改 PHP 如果你可以访问它。 因为它是一个 Wordpress 插件,并且会不时更新。如果它被更新,所有自定义修改都将被覆盖。根据您的建议,我正在尝试使用css,并且在 Chrome 开发人员工具中使用&lt;img id="rating_1981_2" style="float:left"&gt; 似乎起到了交换的作用。但是,如何创建 css 规则,以便包裹在其父级 divpost-ratings 类中的第二个 img 元素注入 float:left;?如果你能得到这个css 作为答案,我很乐意接受它作为我问题的解决方案。谢谢。 是的——这完全有道理——我错过了你解释它是第三方插件的第一段。接听来电。 【参考方案1】:

要实现这一点,您可以使用 CSS。如果将position: relative 放在父div 元素上,然后将position: absolute 放在img 元素上,则可以将它们放置在需要的任何位置。试试这个:

// only here to stop console errors:
function ratings_off() 
function current_rating() 
.post-ratings  
  position: relative; 
  width: 100px;

.post-ratings img  
  position: absolute;
  width: 50px;

.post-ratings img:nth-child(1)  right: 0; 
.post-ratings img:nth-child(2)  left: 0; 
<div id="post-ratings-1981" class="post-ratings" data-nonce="0ab2fb33f4">
  <img id="rating_1981_1" src="./rating_1_on.gif"  title="Down" onmouseover="current_rating(1981, 1, 'Down');" onmouseout="ratings_off(2.5, 3, 0);" onclick="rate_post();" onkeypress="rate_post();" style="cursor: pointer; border: 0px;" />
  <img id="rating_1981_2" src="./rating_2_on.gif"  title="Up" onmouseover="current_rating(1981, 2, 'Up');" onmouseout="ratings_off(2.5, 3, 0);" onclick="rate_post();" onkeypress="rate_post();" style="cursor: pointer; border: 0px;" />
</div>

您可以使用 JS 代码来执行此操作,但是由于 UI 加载时执行延迟,您最终可能会得到 FOUC

【讨论】:

【参考方案2】:

我以这种方式只使用 jquery。我为 up img 添加 css 属性 float:left 和为 down img 添加属性 float:right。然后我附加一个带有 css 属性 clear:both 的跨度来清除左右浮动。

https://jsfiddle.net/byejkqg4/1/

$(document).ready(function()
   $(".post-ratings").each(function()
      $(this).find('img').eq(1).css('float','left');
      $(this).find('img').eq(0).css('float','right');
      $(this).find('img').eq(1).after('<span style="clear:both"></span>');
   )
)

【讨论】:

根据您的 jsfiddle 代码,结果不是交换位置,我仍然以原始顺序看到图像。 Up应该首先出现在哪里,然后是Down

以上是关于如何使用其父类选择器将 HTML 图像标签与 Javascript 交换?的主要内容,如果未能解决你的问题,请参考以下文章

html 5 的CSS3新增的伪类选择器还包括哪些?

HTML 元素拒绝继承其父元素的高度

Visual Studio 提示:类设计器将不可用

使用 GCloud 容器构建器将图像拉取并推送到另一个项目

在 Zend Framework 中,如何使用装饰器将表单元素包装在标签中?

如何只显示 TWinControl 并让其父级处理所有鼠标事件?