Jquery:检查第一个实例

Jquery: Check against first instance

本文关键字:实例 第一个 检查 Jquery      更新时间:2023-09-26

使用奇怪的输出并将其转换为可读的剧本格式时遇到一些麻烦。

这是HTML

<div>
<p class="actor">John</p>
<p class="line">I want to buy milk.</p>
<p class="actor">John</p>
<p class="line">Milk is expensive.</p>
<p class="dirNote">John grabs the milk</p>
<p class="actor">John</p>
<p class="line">I guess its fine.</p>
<p class="actor">Steve</p>
<p class="line">Yeah.</p>
</div>

我试图解决这个问题失败了。但基本的想法是……

遍历p.actor
的每个实例将第一个实例存储为var

检查var

下一个实例

如果它们是相同的

将该实例的p.line的内容附加到var

的p.line中

else替换var

with new p.actor

同样,如果遇到p.d rdir,下一个p.d rator实例将设置新的变量

基本上完成后的HTML应该是这样的

<div>
<p class="actor">John</p>
<p class="line">I want to buy milk. Milk is expensive.</p>
<p class="dirNote">John grabs the milk</p>
<p class="actor">John</p>
<p class="line">I guess its fine.</p>
<p class="actor">Steve</p>
<p class="line">Yeah.</p>
</div>

对可行性有什么想法吗?谢谢你。

下面的代码片段应该可以解决问题。它基本上将集合转换为数组,并从集合中的最后一个元素开始。

$('p.actor').toArray().reverse().forEach(function (el) {
    var 
        $this = $(el), 
        $prev = $this.prev().prev('.actor'), 
        $line
    ;
    if ($this.text() !== $prev.text()) {
        return;
    }
    $line = $this.next('.line');
    $prev.next('.line').append(' ' + $line.text());
    $this.add($line).remove();
});
http://jsfiddle.net/j9qwzyzq/

我有一个半成品的答案。它比我想象的要复杂得多,所以我现在就到此为止。

它循环遍历你的段落,跟踪它们的类型并重新构建一个新的列表。它仍然需要弄清楚如何跟踪上一个(或下一个)行/演员和addRow。希望对你有帮助。

var rows = $("#my-list p"),
newRows = [],
currentActor = null,
currentLine = null,
addRow = function (type, value) {
    newRows.push({
        type: type,
        value: value
    })
};
rows.each(function (index) {
    var $row = $(this),
        className = $row.attr("class"),
        isActor = className == "actor",
        isLine = className == "line",
        isDirNote = className == "dirNote",
        content = $row.text();
    if (isLine) {
        //TODO: keep track of line to be appended to next item (if same actor)
        //TODO: if next element is same actor, append line
        //addRow(className, content);
    }
    if (isDirNote || isActor) {
        addRow(className, content);
    }
    console.log(content, isActor, isLine, isDirNote);
})
console.log(newRows);
//TODO: build new paragraph array from newRows