javascript - 如何在单击时捕获 div 的 id 并将其传递给函数以使代码动态化?

标签 javascript jquery coffeescript

我有一个基于 CoffeeScript 的代码,其中所有定义(ID 和类)都在本地调用。现在我希望它基于动态 View 重构它,即用户在网站中单击时,应该将相应的 ID 发送到该函数。我该如何处理这个问题?

HTML -

<div id="dl1">
 <div class="dl_div">
  <div id="target1" data-key="<%= @aws_url1[:key] if !@aws_url1.nil? %>">
  <% if !@aws_url1.nil? %>
   <img id="user_dl1" src="<%= @aws_url1[:url] %>">
  <% end %>
 </div>
 <div id="close1" style="display: none;">
  <button id="closebtn1" class="closebtn">X</button>
 </div>
 <div id="closemsg1" style="display: none;  position: relative;">
  <button  id="deletebtn1" class="deletebtn">
   <p class="deletebtnstyle">Delete</p>
  </button>
  <button id="cancelbtn1" class="cancelbtn">
   <p class="cancelbtnstyle">Cancel</p>
  </button>
</div>
<div class="file_browser1" id="file_browser1">
  <label for="file_upload1" class="custom-file_upload z-depth-1">
   <i class="material-icons">&#xE147;</i>
   <p class="button-text"> Upload Here</p>
  </label>
<form id="user_id1_form" action="">
  <input type="hidden" name="user_id1_key" value="<%= @aws_urls[0][:key] %>"/>
  <input id="file_upload1" type="file" accept="image/*" name="user_id1"/>
 </form>
 </div>
 </div>
</div>

CoffeeScript -

if $('#target1 img').length == 1
        $('#file_browser1').addClass 'none'
        $('#close1').addClass 'delete'
        $('#closebtn1').on 'click', (e) ->
                $('#closemsg1').addClass 'msg'      
        $('#cancelbtn1').click ->
                $('#closemsg1').removeClass 'msg'
        $('#deletebtn1').click ->
                $('#close1').removeClass 'delete'
                $('#closemsg1').removeClass 'msg'
                $('#target1 > img').hide()
                $('#file_browser1').removeClass 'none'
                $('#file-upload1').val('')
                return

    $('#file_upload1').on 'change', (event) ->
        files = event.target.files
        image = files[0]
        old_key = $("#target1").data("key");
        new_key = null
        $user_id1 = $('#file_upload1')[0].files[0];
        console.log image.size
        reader = new FileReader
        $.ajax({
            type: "GET",
            url: "http://localhost:3000/users/get_url/13",
            success :(data) ->
                new_key = data[0].key
                processfile $user_id1,(result)->
                    console.log data[0].url
                    $user_id1 = dataURItoBlob(result)
                    reader1 = new FileReader()
                    reader1.readAsArrayBuffer($user_id1)
                    reader1.onload = (e) ->
                        rawData1 = reader1.result;
                        $.ajax({ 
                            url: data[0].url, 
                            type: 'PUT',
                            xhr: -> 
                                myXhr = $.ajaxSettings.xhr();
                                if (myXhr.upload)
                                    myXhr.upload.addEventListener('progress', progressHandlingFunction, false);
                                return myXhr;
                            ,
                            success: completeHandler,
                            error: errorHandler,
                            data: rawData1,
                            cache: $.param(false),
                            contentType: "binary/octet-stream",
                            processData: $.param(false)
                        }, 'json');
        })

        completeHandler = (data) ->
            $.ajax({
                type: "POST",
                url: "http://localhost:3000/users/user_documents/13",
                data: { 
                    aws_key_new: new_key,
                    aws_key_old: old_key,
                    dl_id: "dl",
                },
                success: ->
                    a = $('#target1')
                    console.log a.data("key")
                    console.log new_key
                    a.attr('data-key', new_key);
            })

            success :(data) ->
                alert "complete"
                return

            error :(data) ->
                alert "failed"
                return

        errorHandler = (data) ->
            console.log data
            alert "failed"

        progressHandlingFunction = (data) ->

        reader.onload = (file) ->
            img = new Image
            img.src = file.target.result
            $('#target1').html img
            $('#file_browser1').addClass 'none'
            $('#close1').addClass 'delete'
            $('#closebtn1').on 'click', (e) ->
                    $('#closemsg1').addClass 'msg'      
            $('#cancelbtn1').click ->
                    $('#closemsg1').removeClass 'msg'
            $('#deletebtn1').click ->
                    $('#close1').removeClass 'delete'
                    $('#closemsg1').removeClass 'msg'
                    $('#target1 > img').hide()
                    $('#file_browser1').removeClass 'none'
                    $('#file-upload1').val('')
                    return
            return

        reader.readAsDataURL image
        console.log files
        return

如何在点击时将 ID 传递给 CoffeeScript ?

最佳答案

如果我从您的问题中了解到,您希望将点击事件添加到一组元素,并能够在触发时获取它们各自的值。

一种方法是将点击事件添加到属性类中:

例如(使用jquery):

// Add click event to the class .drill_cursor
$(".drill_cursor").click(function(){
  console.log(this.id);
});

// Used to display console.log
var consoleLine = "<p class=\"console-line\"></p>";
console = {
    log: function (text) {
        $("#console-log").append($(consoleLine).html(text));
    }
};
.console-line {
  font-family: monospace;
  color: red;
  margin: 2px;
}
.drill_cursor {
  margin: 50px;
  color: blue;
}
<head>
  <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
</head>

<body>
  <div id="console-log"></div> 

  <div id="id-div-1" class="drill_cursor" >div-1-click-on-me</div>
  <div id="id-div-2" class="drill_cursor" >div-2-click-on-me</div>
  <div id="id-div-3" class="drill_cursor" >div-3-click-on-me</div>
  <div id="id-div-4" class="drill_cursor" >div-4-click-on-me</div>

</body>

另一种方法是将事件委托(delegate)给另一个元素标签:

您可以在此处找到有关委托(delegate)事件的更多信息:

api.jquery.com/delegate

对于某些情况,委托(delegate)事件是动态添加事件的更好方法!

希望对你有帮助! 祝你好运!

关于javascript - 如何在单击时捕获 div 的 id 并将其传递给函数以使代码动态化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45753769/

相关文章:

javascript - Coffee中的绑定(bind)和调用函数

ruby-on-rails - 订阅 Action Cable channel 时如何设置参数

javascript - 为什么我的 jQuery 点击函数没有触发?

javascript - AJAX 实时搜索 - 向 PHP 发送多个值

javascript - 如何从函数作用域之外访问数据?

javascript - 为 if window.location.href.indexOf() 使用变量

javascript - jquery中如何默认折叠所有 Accordion ?

javascript - 如何从字段值中删除 NaN 并显示值?

javascript - Chrome 扩展消息传递

javascript - 如何获取文档创建后添加的点击元素的ID?