【问题标题】:translate php key to javascript for logging将 php 密钥转换为 javascript 以进行日志记录
【发布时间】:2019-02-16 02:43:23
【问题描述】:

我有一个 php 循环,可以正确显示我期望作为 html 标题的值。

我在这里要做的是为每一个创建一个隐藏输入,所以如果类别有 15 个标签,我想要 15 个隐藏输入。

下面的代码通过记录正确的信息“起作用”,但是,它只记录第一个。

显然,这是因为 php/html 循环分配了一个键,但 javascript 正在提取一个非唯一 ID。

如何正确地将这个键翻译成 javascript,以便记录所选项目的实际值,而不仅仅是第一个?

@foreach($items as $key => $item)

<h3 class="uk-width-4-10">{{$item->category}}</h3>
<input type="hidden" name="edit_category" id="edit_category" value="{{$item->category}}" />

@endforeach



function editCommentModal(){

console.log(document.getElementById("edit_category").value);

}

更新:

模态代码和包含 onclick 事件的 span 代码

@foreach($items as $key => $item)

<!-- display category and button -->
<h3 class="uk-width-4-10">{{$item->category}}</h3>
<a href="#edit-modal{{ $key }}" data-uk-modal><span onclick="editCommentModal()" class="uk-icon-plus-square"></span></a>


<!-- modal -->
<div id="edit-modal{{ $key }}" class="uk-modal edit-modal">

<h3 class="uk-width-4-10">{{$item->category}}</h3>
<input type="hidden" name="edit_category[]" id="edit_category" value="{{$item->category}}" />

</div>

@endforeach


function editCommentModal(){
 var inps = document.getElementsByName('edit_category[]');
 for (var i = 0; i <inps.length; i++) {
    var inp=inps[i];
    console.log("edit_category["+i+"].value="+inp.value);
 }
}

【问题讨论】:

  • 显然,这是因为 php/html 循环分配了一个键,但 javascript 正在提取一个非唯一 ID。 所以不要使用非唯一 ID .使用类
  • HTML 元素 id 在文档中应该是唯一的

标签: javascript php jquery html laravel


【解决方案1】:

使用类而不是id,然后你可以按类找到它们,然后对它们做任何你想做的事情。

<input type="hidden" name="edit_category" class="edit_category" value="{{$item->category}}" />

document.getElementsByClassName('edit_category')

var categories = document.getElementsByClassName('edit_category');

Array.prototype.forEach.call(categories, function(category){
  console.log(category.value);
});
    <input type="hidden" name="edit_category" class="edit_category" value="a" />
    <input type="hidden" name="edit_category" class="edit_category" value="b" />
    <input type="hidden" name="edit_category" class="edit_category" value="c" />

    

【讨论】:

  • 所以我实际上正在尝试,但 console.log 中的值打印为未定义
  • getElementByClassName 将返回一个 NodeList (iirc),因此您必须遍历每个节点才能访问它的 .value,如果您想对其进行控制台记录
  • 哦,我明白了。因此,如果我添加更多标题和隐藏输入,那么我只需为每个标题建立一个这样的块
【解决方案2】:
@foreach($items as $key => $item)

<!-- display category and button -->
<h3 class="uk-width-4-10">{{$item->category}}</h3>
<a href="#edit-modal{{ $key }}" data-uk-modal><span onclick="editCommentModal({{ $key }})" class="uk-icon-plus-square"></span></a>


<!-- modal -->
<div id="edit-modal{{ $key }}" class="uk-modal edit-modal">

<h3 class="uk-width-4-10">{{$item->category}}</h3>
<input type="hidden" name="edit_category[]" id="{{ 'edit_category_' . $item->id }}" value="{{$item->category}}" />

</div>

@endforeach


function editCommentModal(id){
 var inps = document.getElementsByName('edit_category[]');
 for (var i = 0; i <inps.length; i++) {
    var inp=inps[i];
    if('edit_category_' + id == inp.id)
    {
      console.log("edit_category["+i+"].value="+inp.value);
    }
 }
}    

【讨论】:

  • 所以这行得通,但它列出了页面上每个项目的值,我只希望它显示所选项目的值。 javascript中的这个函数是在点击按钮时触发的
  • 哦,这完全是另一个问题。然后,您必须使用 onclick 事件,传递类别的 id 或 id 本身并显示它。
  • 我是,我有一个带有 onClick 的跨度,可以启动此功能。 onclick 有效,但它显示了页面的所有值。所以我有一个包含多个项目的 div,每个项目都有自己的跨度/按钮。当单击时,我只想记录所选数据的数据
  • 我该怎么做呢?使用您的答案,它会记录所有正确的项目。因此,在您的代码上下文中,我将如何做到这一点
  • 贴出你剩下的相关代码,我想要一个视觉效果
【解决方案3】:

首先; id 应该是唯一的,所以我建议您将 id 更改为 class。要获取所有值,您可以将名称 edit_category 更改为输入数组 edit_category[]。如果您想添加更多隐藏的输入字段,您可以使用您在循环中获得的索引!

@foreach($items as $key => $item)
   <h3 class="uk-width-4-10">{{$item->category}}</h3>
   <input type="hidden" name="edit_category[]" class="edit_category" value="{{$item->category}}" />
@endforeach

function editCommentModal(){
    var all_categories = document.getElementsByName('edit_category[]');
    var all_names = document.getElementsByName('edit_names[]');
    for (var i = 0; i <all_categories.length; i++) {
        var category=all_categories[i];
        var name=all_names[i];
        console.log("edit_category["+i+"].value="+category.value);
        console.log("edit_names["+i+"].value="+name.value);
    }
}

【讨论】:

  • 因此,如果我想使用更多隐藏输入来执行此操作,我会遵循相同的结构,并且最好为每个输入执行一个新的 var/for 循环?
  • @TomN。更新了我的答案!请确保 all_categories 和 all_names 具有相同的长度;-)
  • 是的,他们这样做了,效果很好,谢谢!但是,这显示了页面上每个项目的值,我只希望它记录所选项目的值。所以这个javascript函数是由点击触发的,我只想显示点击的项目的值
  • 哦,这完全是另一个问题。然后,您将不得不使用 onclick 事件。
  • 我在 span 标签上有一个 onclick 事件,它会触发这个函数。这样可以,但是如果他们单击某个项目的按钮,我只想捕获该数据
猜你喜欢
  • 2019-01-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多