【问题标题】:Can jQuery or Javascript change elements within textareas?jQuery 或 Javascript 可以更改文本区域中的元素吗?
【发布时间】:2013-12-06 17:38:33
【问题描述】:

我的第一个 SO 问题!这是我想要做的:

我正在重写一个工具,它可以生成一些用户可以直接粘贴到 Craigslist 和其他分类广告发布网站的代码。我创建了一个网站列表(它们使用 PHP 从数据库中填充),用户可以使用单选按钮从中进行选择,我希望他们的选择填充为一些之间的纯文本(而不是链接) <p></p> 文本区域中的元素。我正在为此使用 jQuery。

用户选择之前的文本区域:

    <p id="thing"></p>

用户选择后的Textarea:

    <p id="thing">www.somewebsite.com</p>

HTML

<input type="radio" name="sitechoice" value="www.websiteone.com">www.websiteone.com<br />
<input type="radio" name="sitechoice" value="www.secondwebs.com">www.secondwebs.com

<textarea>
 Some stuff already in here
 Here is the website you chose:
 <p id="thing"></p>
 More stuff already here.
</textarea>

JS

$(document).ready(function () {
    $("input").change(function () {
        var website = $(this).val();
        alert(website);
        $("#thing2").html(website);
    });
});

JS Fiddle(使用 cmets)

如果你看到 JS Fiddle,你可以看到我在 textarea 之外的页面上放了另一个 p 元素,它更新得很好,但 textarea 里面的那个没有。我已经阅读了许多关于 SO 的其他类似问题,并且我开始认为我无法更改 textarea 标签之间的元素,我只能更改整个 textarea 本身。请引导我开悟!

【问题讨论】:

  • textarea 中的“p 元素”不是元素,它只是纯文本。 Textarea 不能有 HTML。
  • 我猜上面的评论就是答案:)
  • @Teemu - 但这并不意味着他不能改变价值,尽管如此。 . .只是他不能只使用 DOM 操作来做到这一点。
  • @Teemu 你可以把它当作一个 HTML 元素,如果你把它拉出来并用 jQuery 的$() 包裹它,或者像链接@一样使用普通的 JS PrashantBorde 提供。

标签: javascript jquery html css textarea


【解决方案1】:

您实际上可以相当容易地操作 textarea 的文本内容,就像它是 DOM 的一部分一样,通过将其内容转换为 jQuery 对象。

这是一个演示此解决方案的 jsFiddle:http://jsfiddle.net/YxtH4/2/

相关代码,在输入变化事件里面:

// Your normal code
var website = $(this).val();
$("#thing2").html(website);

// This turns the textarea's val into a jQuery object ...
// And inserts it into an empty div that is created
var textareaHtml = $('<div>' + $("#textarea").val() + '</div>');
// Here you can do your normal selectors
textareaHtml.find("#thing").html(website);
// And this sets the textarea's content to the empty div's content
$("#textarea").val(textareaHtml.html());

包装 HTML 的空 div 是为了让您以后可以使用 jQuery 的 .html() 方法轻松地将其作为字符串检索,因此如果在 p 元素内的文本区域。

真正的魔力是$($("#textarea").val()),它获取您的文本区域的文本并将其解析为包含在 jQuery 对象中的 HTML 节点。

【讨论】:

  • 我试过你的小提琴,只要&lt;p&gt; 周围没有任何文字,它就很好用,但是当我在它周围添加文字时,它停止工作(在小提琴上)。但是,无论如何,我真的很喜欢你的处理方式。
  • 虽然我绝对同意知道您可以使用 $(STRING_VAL) 从字符串创建 DOM 很高兴知道,但这似乎不是矫枉过正,当您可以简单地获取 textarea 的值时,更新,然后重新设置?
  • @talemyn 我以为他的问题只是一个例子,他打算以后做一些更复杂的事情,这样看起来不太像矫枉过正。
  • @flange001 啊,这是因为当第一个发现是文本时,jQuery 抛出了一个错误。我通过更改 div 包装器的创建方式更新了我的答案和 jsFiddle,使其现在可以工作。
  • 好的,我知道你做了什么,效果很好。我明白为什么$("&lt;div&gt;").append($($("#textarea").val())); 与var textareaHtml = $('&lt;div&gt;' + $("#textarea").val() + '&lt;/div&gt;'); 相比会出现问题,而且后者看起来好多了。就像我说的,我认为创建一个不可见的 div 然后操纵 div 很聪明。我认为@talemyn 的解决方案是一种更直接的方法,但这两种方法都是思考这个问题的好方法,而且我现在肯定比今天早上知道的更多。 编辑:过早点击返回。
【解决方案2】:

它无法按照您的想法进行操作(即,将其作为 DOM 元素进行操作),但它仍然可以作为 textarea 的值访问,因此您可以像这样检索它,使用基本的字符串操作来改变它,然后再次将更新的字符串设置为 textarea 的新值。

像这样的东西。 . .首先给&lt;textarea&gt; 一个id 值:

<textarea id="taTarget">
    Some stuff already in here
    Here is the website you chose:
    <p id="thing"></p>
    More stuff already here.
</textarea>

然后像这样改变你的脚本:

$(document).ready(function () {
    $("input").change(function () {
        var website = $(this).val();

        var currentTAVal = $("#taTarget").val();
        $("#taTarget").val(currentTAVal.replace(/(<p id="thing">)([^<]*)(<\/p>)/, "$1" + website  + "$3"));
    });
});

除非您需要其中的&lt;p&gt; 元素,否则您可以考虑使用更简单的占位符,因为它实际上不会充当文本区域中的HTML 元素。 :)

编辑:修正了 .replace() 正则表达式中的错字。

【讨论】:

  • 效果很好,非常感谢!正则表达式正是我所需要的,并且是一个非常优雅的解决方案。我的一个问题是replace() 方法末尾的"$1" 和"$3" 是什么?除了这些,我什么都懂。
  • 你应该只使用一个var 每个范围顺便说一句。有助于防止吊装错误,整体也更清洁。
  • 没问题。 . .很高兴它对你有用。 :) "$1" 和 "$3" 是表示正则表达式中捕获的组的标记。在这种情况下,我使用的模式中有三个捕获的组。 . . (&lt;p id="thing"&gt;) 和 (&lt;\/p&gt;) 是第一个和第三个(因此,"$1" 和 "$3")。如果你想用([^&lt;]*) 做某事,那将被"$2" 表示。
  • @tibbon - 嗯。 . .只要您对代码不粗心,“单个与多个var”实际上是个人喜好。就个人而言,我喜欢将它们分开以提高可读性,并避免声明可能永远不会使用的变量(例如,基于if 逻辑)。对此有很多讨论:例如,stackoverflow.com/questions/810313/…、stackoverflow.com/search?q=one+var+vs+multiple+javascript 和 benalman.com/news/2012/05/multiple-var-statements-javascript。
【解决方案3】:

我知道这个答案有点晚了,但这里是 =)

您可以完全按照您想要的方式进行操作。但为此,您需要实现一个小技巧。

拥有这个 HTML

<input type="radio" name="sitechoice" value="www.websiteone.com">www.websiteone.com
<br />
<input type="radio" name="sitechoice" value="www.secondwebs.com">www.secondwebs.com
<p id="thing2"></p>
<textarea id="textarea">
<p id="thing"></p>
</textarea>

您可以通过实现类似功能 changeInnerText

来编辑 textarea 内容,作为 DOM
$(document).ready(function () {
    $("input").change(function () {
        var website = $(this).val(); // Gets value of input
        changeInnerText(website);
        //$("#thing").html(website); // Changes
        //$("#thing2").html(website); // Does not change
    });

    var changeInnerText = function(text) {
        var v = $("#textarea").val();
        var span = $("<span>");
        span.html(v);
        var obj = span.find("#thing")[0];
        $(obj).html(text);

        console.log(obj);        
        console.log(span.html());

        $("#textarea").val(span.html());
    }
});

如你所见,我只是从 textarea 中获取信息,我创建了一个临时变量 span 来放置 textarea 的内容。然后将其作为 DOM 进行操作。

【讨论】:

  • 这几乎就是我所采用的实现方式。这是我早期的一个超级老问题!
【解决方案4】:

不要尝试将文本插入&lt;p&gt; 元素,而是将文本插入&lt;textarea&gt; 元素并包含&lt;p&gt; 标记。像这样的东西应该可以解决问题:

变化:

$("#thing").html(website);

到:

$("textarea").html('<p id="thing">'+website+'</p>');

这是一个小提琴:http://jsfiddle.net/nR94s/

【讨论】:

    猜你喜欢
    • 2011-04-14
    • 2013-10-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-04
    • 2015-08-25
    相关资源
    最近更新 更多