jQuery-在所有项目上运行keyup函数

凯尔·安德希尔(Kyle Underhill):

该代码采用一个YouTube网址,并获取该链接的缩略图,并将其缩短。问题是,当我尝试更改代码以使其适用于输入的每个实例时,而不仅仅是链接到ID的一个实例:

目前仅适用于ID为:的输入:

var elemOutput = document.getElementById("thumb_video");

试图更改为classname以便在每个实例上工作:

var elemOutput = document.getElementsByClassName("video__thumb");

如何获得在的每个实例上运行的代码input

/**
 * Get YouTube ID from various YouTube URL
 * @author: takien
 * @link https://gist.github.com/takien/4077195
 */

function YouTubeGetID(url) {
  var ID = "";
  url = url
    .replace(/(>|<)/gi, "")
    .split(/(vi\/|v=|\/v\/|youtu\.be\/|\/embed\/)/);
  if (url[2] !== undefined) {
    ID = url[2].split(/[^0-9a-z_\-]/i);
    ID = ID[0];
  } else {
    ID = url;
  }
  return ID;
}

/**
 *
 */
function getPosterUrl(url) {
  var posterUrl = "https://i.ytimg.com/vi/{videoID}/maxresdefault.jpg";
  var videoID = YouTubeGetID(url);

  posterUrl = posterUrl.replace(/{videoID}/g, videoID);

  return posterUrl;
}

function setPosterUrl(url) {
  var videoID, posterUrl, elemContainer, elemAnker, elemImg;
  var images = [
    /*"maxresdefault.jpg",
    "sddefault.jpg",
    "hqdefault.jpg",
    "mqdefault.jpg",*/
    "default.jpg"
  ];

  videoID = YouTubeGetID(url);

  var elemOutput = document.getElementById("thumb_video");

  elemOutput.innerHTML = "";

  images.forEach(function(item, index) {
    elemContainer = document.createElement("div");
    elemAnker = document.createElement("a");
    elemImg = document.createElement("img");

    posterUrl = "https://i.ytimg.com/vi/" + videoID + "/" + images[index];

    elemAnker.href = posterUrl;
    elemAnker.setAttribute("target", "_blank");
    elemAnker.setAttribute("rel", "noopener");

    elemImg.src = posterUrl;
    elemImg.setAttribute("alt", "");

    elemAnker.appendChild(elemImg);
    elemContainer.appendChild(elemAnker);
    elemOutput.appendChild(elemContainer);
  });
}

$(document).ready(function() {
  var $input = $(".video__input");
  var $icon = $(".video__icon");
  var valLength;

  $input.on("keyup", function(e) {
    var newval = "",
      $this = $(this);

    if ((newval = $this.val().match(/(\?|&)v=([^&#]+)/))) {
      $this.val(newval.pop());
    } else if ((newval = $this.val().match(/(\.be\/)+([^\/]+)/))) {
      $this.val(newval.pop());
    } else if ((newval = $this.val().match(/(\embed\/)+([^\/]+)/))) {
      $this.val(newval.pop().replace("?rel=0", ""));
    }
    e.preventDefault();
    setPosterUrl($input.val());
    $icon.hide();
  });

  $input.on("input", function() {
    valLength = $.trim($(this).val()).length;
  });
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div class="item">
  <input class="video__input" type="text" placeholder="Video URL">
  <div class="video__thumb" id="thumb_video"></div>
  <div class="video__icon">Test</div>
</div>
<div class="item">
  <input class="video__input" type="text" placeholder="Video URL">
  <div class="video__thumb" id=""></div>
  <div class="video__icon">Test</div>
</div>

该死的 :

两件事情:

  1. 您必须遍历所有项目,以某种方式知道哪些项目属于同一项目。(请参见代码)var $items = $(".item"); $items.each(function(){ var $input = $(this).children(".video__input"); // .... and more

  2. setPosterUrl()函数内部,您刚刚从其他地方选择了另一个ID为ID的元素,因此就将其覆盖。现在已更改,因此您可以将元素(普通的javascript元素)传递给您的函数,该函数就是图像占位符...

/**
 * Get YouTube ID from various YouTube URL
 * @author: takien
 * @link https://gist.github.com/takien/4077195
 */

function YouTubeGetID(url) {
  var ID = "";
  url = url
    .replace(/(>|<)/gi, "")
    .split(/(vi\/|v=|\/v\/|youtu\.be\/|\/embed\/)/);
  if (url[2] !== undefined) {
    ID = url[2].split(/[^0-9a-z_\-]/i);
    ID = ID[0];
  } else {
    ID = url;
  }
  return ID;
}

/**
 *
 */
function getPosterUrl(url) {
  var posterUrl = "https://i.ytimg.com/vi/{videoID}/maxresdefault.jpg";
  var videoID = YouTubeGetID(url);

  posterUrl = posterUrl.replace(/{videoID}/g, videoID);

  return posterUrl;
}

function setPosterUrl(onThisElement, url) {
  var videoID, posterUrl, elemContainer, elemAnker, elemImg;
  var images = [
    /*"maxresdefault.jpg",
    "sddefault.jpg",
    "hqdefault.jpg",
    "mqdefault.jpg",*/
    "default.jpg"
  ];

  videoID = YouTubeGetID(url);

  var elemOutput = onThisElement;

  elemOutput.innerHTML = "";

  images.forEach(function(item, index) {
    elemContainer = document.createElement("div");
    elemAnker = document.createElement("a");
    elemImg = document.createElement("img");

    posterUrl = "https://i.ytimg.com/vi/" + videoID + "/" + images[index];

    elemAnker.href = posterUrl;
    elemAnker.setAttribute("target", "_blank");
    elemAnker.setAttribute("rel", "noopener");

    elemImg.src = posterUrl;
    elemImg.setAttribute("alt", "");

    elemAnker.appendChild(elemImg);
    elemContainer.appendChild(elemAnker);
    elemOutput.appendChild(elemContainer);
  });
}

$(document).ready(function() {
  var $items = $(".item");

  $items.each(function(){
    var $input = $(this).children(".video__input");
    var $icon = $(this).children(".video__icon");
    var valLength;
  
    $input.on("keyup", function(e) {
      var newval = "",
      $this = $(this);

      if ((newval = $this.val().match(/(\?|&)v=([^&#]+)/))) {
        $this.val(newval.pop());
      } else if ((newval = $this.val().match(/(\.be\/)+([^\/]+)/))) {
        $this.val(newval.pop());
      } else if ((newval = $this.val().match(/(\embed\/)+([^\/]+)/))) {
        $this.val(newval.pop().replace("?rel=0", ""));
      }
      e.preventDefault();
      setPosterUrl($icon[0], $input.val()); // $icon[0] the "[0]" part is only to convert from jQuery element to plain javascript element!
      $icon.hide();
    });

    $input.on("input", function() {
      valLength = $.trim($(this).val()).length;
    });
  });
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div class="item">
  <input class="video__input" type="text" placeholder="Video URL">
  <div class="video__thumb" id="thumb_video"></div>
  <div class="video__icon">Test</div>
</div>
<div class="item">
  <input class="video__input" type="text" placeholder="Video URL">
  <div class="video__thumb" id=""></div>
  <div class="video__icon">Test</div>
</div>

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

从foreach循环的所有元素运行jquery函数

jQuery不能在所有地方正常工作

需要在所有ajax和jquery post函数之前调用一个javascript函数

jQuery在所有自定义事件上触发函数

在jQuery中使用foreach语句时,在所有ajax请求完成后调用函数

jQuery在所有浏览器上使用背景进行不同图像平滑悬停

jQuery-第一个要单击的将绑定在所有项目上

为什么我的函数在所有创建的元素上运行?

jQuery On()'click'在所有事情上都起作用?

在单行而不是全部上运行jQuery函数?

jQuery $ .each与DOM循环,不能在所有元素上使用

预测性搜索结果:在keyup函数中完成getJSON之后,jQuery运行函数

为什么这个JQuery'keyup'函数没有填充div?

在<ul>上的jQuery .appendTo()在所有<ul>上工作,而不在指定的<ul>上工作

在jQuery中调整图像大小无法在所有图像上使用

jQuery代码无法在我的项目上运行

在具有不同值但类名称相同的所有div上运行jQuery函数

jQuery子菜单显示在所有李的

所有站点的Angular运行jQuery代码

我如何使我的jQuery代码在所有元素上都能正常工作

jQuery从JSON返回所有项目

jQuery:使用事件委托时,可以在所有选择器上应用操作吗?

所有JavaScript结束后运行的jQuery

如何使用jQuery在所有页面上自动调用函数

'keyup' 上的 Jquery 没有绑定

jQuery 确保一个函数在所有其他函数之前运行的最佳方法

在页面加载时执行 JQuery 函数,而不是在 .keyup 上

jQuery 函数在所有具有相同类或 ID 以相同名称开头的元素上运行

在不同的类上运行 jQuery 函数