【问题标题】:Output Javascript Array into DIV将 Javascript 数组输出到 DIV
【发布时间】:2018-11-04 15:41:09
【问题描述】:

我有一个函数,它显示/应该从文本区域输出 url(它应该只列出 url)。但目前它只向我显示最后的结果/网址。我怎样才能输出所有的数组/网址(也许是一个 div)。

我的代码:

<textarea id="textarea"></textarea>

<div id="converted_url"></div>

<script type="text/javascript">
$("#textarea").on("change keyup paste", function() {
    var text=document.getElementById("textarea").value;
    var urlRegex = /(https?:\/\/[^\s]+)/g;
    text.replace(urlRegex, function(url) {
    var link = '<div><a href="' + url + '">' + url + '</a></div>';
    document.getElementById("converted_url").innerHTML=link
    })
});
</script>

此刻输出(使用此代码):

希望(应该):

我不希望追加结果,因为文本区域更改后结果不会更新。 IE:

【问题讨论】:

  • 您的.replace() 回调总是完全覆盖&lt;div&gt; 内容。
  • 但它并没有像我所知的那样覆盖。它只是输出最后一个 url...
  • 你知道我怎样才能得到所有的网址吗?
  • 在调用.replace() 之前清除&lt;div&gt;,而不是更新.innerHTML 将URL 累积在一个字符串中。然后在.replace() 之后将.innerHTML 设置为字符串。
  • 对不起,我不明白...你能把代码发给我吗?

标签: javascript regex url output textarea


【解决方案1】:

每当您更新结果区域时,都会覆盖以前的结果。您需要附加到它。

仅供参考:input 事件是一个广泛的事件,只要元素有任何类型的输入,就会触发该事件。您可能会发现它比监听多个事件更简单、更直接。此外,由于您使用的是 JQuery,因此您不妨始终如一地使用它来获取所有 DOM 引用。

let result = $("#converted_url");

$("#textarea").on("input", function() {
    result.html(""); // Reset the output
    
    var urlRegex = /(https?:\/\/[^\s]+)/g;
    $("#textarea").val().replace(urlRegex, function(url) {
      var link = '<div><a href="' + url + '">' + url + '</a></div>';
     
      // Append the new information to the existing information
      result.append(link);
    });
});
textarea { width:200px; height:50px;}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
(Just type anything in the box to trigger the event.)<br>
<textarea id="textarea">http://google.com blah blah http://facebook.com</textarea>

<div id="converted_url"></div>

【讨论】:

  • 感谢您提供代码。但是有一个问题...它会显示重复的输出,当我清除 textarea 时会显示最后一个结果...
  • @brox 你只需要添加一行来清除输出元素。答案已更新以显示这一点。
  • 完全符合我的要求。非常感谢。
  • 虽然我有一个问题。您能否检测一个 url 是否出现多次并将其汇总/合并并仅显示一次 url。即:文本:blah blah google.com blah blah blah google.com blah blah facebook.com 输出:google.com, facebook.com
  • @brox 是的,但这是一个单独的问题,我建议您发布一个新问题来询问这个问题。但是,这里有一个提示。使用字符串.split() 方法将字符串拆分为使用空格作为分隔符的数组。然后使用Array.filter()方法过滤掉重复项。
【解决方案2】:

我写这段代码是为了解决你的问题。

如果您对代码有任何疑问,请告诉我。

var urlsContainer = $("#converted_url");
var urlsTextArea = $("#textarea");
$("#textarea").on("input", function () {
  var text = urlsTextArea.val();
  var urls = [];
  var raw_urls = text.split('\n');
  for (x = 0; x < raw_urls.length; x++) {
    if (isValidUrl(raw_urls[x]) && urls.indexOf(raw_urls[x]) < 0) {
      urls.push(raw_urls[x]);
    }
  }
  urlsUpdated(urls);
});
function urlsUpdated (urls) {
  urlsContainer.html('');
  for (x = 0; x < urls.length; x++) {
    urlsContainer.append('<div><a href="' + urls[x] + '">' + urls[x] + '</a></div>');
  }
}
function isValidUrl(str) {
  var regex = /(http|https):\/\/(\w+:{0,1}\w*)?(\S+)(:[0-9]+)?(\/|\/([\w#!:.?+=&%!\-\/]))?/;
  if(!regex.test(str)) {
    return false;
  }
  return true;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<textarea id="textarea"></textarea>
<div id="converted_url"></div>

更新

很高兴您找到了解决方案。我添加了我的解决方案的工作示例屏幕截图。

example-screenshot

更新 2.0

let result = $("#converted_url");

$("#textarea").on("input", function() {
    result.html(""); // Reset the output
    
    var urlRegex = /(https?:\/\/[^\s]+)/g;
    var urls = [];
    $("#textarea").val().replace(urlRegex, function(url) {
      if (urls.indexOf(url) > -1) {
        return;  
      }
      urls.push(url);
    });
    for (x = 0; x < urls.length; x++) {
      var link = '<div><a href="' + urls[x] + '">' + urls[x] + '</a></div>';
      result.append(link)
    }
});
textarea { width:200px; height:50px;}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
(Just type anything in the box to trigger the event.)<br>
<textarea id="textarea"></textarea>

<div id="converted_url"></div>

示例截图

【讨论】:

  • 非常感谢您的时间和代码。上面的代码已经完美运行。虽然我有一个问题。您能否检测一个 url 是否出现多次并将其汇总/合并并仅显示一次 url。即:文本:废话google.com废话废话google.com废话废话facebook.com输出:google.comfacebook.com
  • 我更新了答案。我没有更改代码,而是添加了一个屏幕截图来显示我的解决方案的工作示例。
  • 我的代码通过文本区域中的换行符来识别每个 URL。您必须定义一个分隔符。我使用换行符作为分隔符,你可以定义你的。您可以通过将代码中的\n 更改为|, 之类的任何内容来更改分隔符,我使用了\n,这是一个换行符。
  • 我刚刚发现这段代码有问题...我现在已将其更改为常规空格。但是现在换行不起作用......我有一个非常好的代码(斯科特马库斯)。他的代码唯一的一点是,如果你有重复的网址,它会列出两者。如果您可以查看他的代码,那就太好了。我将为这个问题打开一个单独的问题。非常感谢您的宝贵时间,我很感激!
  • 检查更新 2.0。我更新了 Scott Marcus 的代码以解决重复问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-02-18
  • 1970-01-01
  • 1970-01-01
  • 2019-05-28
  • 1970-01-01
  • 2020-02-21
  • 2013-10-25
相关资源
最近更新 更多