控制backspace键删除字符实现微博用户删除+展现选择好友列表

本文介绍了一款微博系统中实现的一键删除一个用户和选定好友功能的详细过程,包括HTML、JavaScript的使用及关键事件监听。通过案例演示了字数限制和删除用户操作的实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近项目中应用到了微博系统。本人做了一个模仿微博一键删除一个用户的功能和选定好友的功能。

功能截图如下:



说明:主要是onpropertychange事件和onkeydown事件


代码如下:

案例一:onpropertychange的应用[微博字数控制]

 

 

Html:

还可以输入<font id="textnumwin">300</font>字

<textarea id="content" name="content"onpropertychange="javascript:textareaChangeWin(this)"></textarea>

 

Js控制:

//计算还可以输入多少text---Win

function textareaChangeWin(thisp){

    var len = thisp.innerHTML.length;  //取得目前的字符长度

    var l = 300-len;            //还剩下多少字可以输入

    var textval = thisp.innerHTML;

    if(len >300){

       l = 0;

       textval = textval.substr(0,300);   //如果大于300就截取

       thisp.innerHTML = textval;

    }

    $('#textnumwin').text(l);

}

 

 

 

案例2:微博控制backspace键删除一个用户

Html:

发给:<input onkeydown="DeleteUserNameMore(event)" class="alerttxt" type="text"id="fname" name="fname"onpropertychange="javascript:listFriend(this)"/>

<ul class="recommend-list" id="friendUl" style="display:none;">

</ul>

 

Js控制—删除字符:

//一下backspace键删除一个用户,而不是一个字符

function DeleteUserNameMore(e){

       var keynum;

       if(window.event) // IE

       {

         keynum = e.keyCode

       }

       else if(e.which) // Netscape/Firefox/Opera

       {

         keynum = e.which

       }

       if(keynum == 8){

           //删除一个用户的操作

           var fnameval = document.getElementById("fname").value;

           var touseridval = document.getElementById("touserid").value;

          

          

           var lastIndexF = fnameval.lastIndexOf(';');   //最后一个分号的位置

           var resultFnameStr = '';

           var resultTouseridStr = touseridval;

           if(fnameval.indexOf(';') != -1){   //有分号

              if(lastIndexF == fnameval.length-1){     

                  //分号在最后的位置,直接删除一个用户

                  resultFnameStr =fnameval.substring(0,fnameval.substring(0,fnameval.length-1).lastIndexOf(';')+1);

                  resultTouseridStr =touseridval.substring(0,touseridval.substring(0,touseridval.length-1).lastIndexOf(';')+1);

                  e.returnValue=false; //禁用backspace

              }else{

                  //有分号但是不在最后一个位置,不做任何处理nothing

                  resultFnameStr = fnameval;

              }

           }else{ //没有分号

              resultFnameStr =fnameval;

           }

           document.getElementById("fname").value = resultFnameStr;

           document.getElementById("touserid").value =resultTouseridStr;

       }

    }

 

 

 

 

 

2、Js控制列出好友列表(附件)---代码未给全。自己备注用,主要看回调函数中的操作DOM就可以了

 

//展现好友列表

    function listFriend(thisp){

           var likeScreenName =thisp.value;

          

           PlayUl();  //显示自动提示ul

           var platformval = $('#currentPlatform').val();   //当前平台腾讯Or新浪

           var currentUserid = $('#currentUserid').val();   //当前账号平台ID

          

          

           var currentScreenName = '';

           if(likeScreenName.indexOf(';') != -1){

              var ScreenArray =likeScreenName.split(';');

              currentScreenName = ScreenArray[ScreenArray.length-1]

           }else{

              currentScreenName =likeScreenName;      

           }

          

          

           var dataJson = {

              platform :platformval,

              userid : currentUserid,

              likesc : currentScreenName

           }

           jQuery

                  .ajax({

                     async : true,//同步还是异步,false=同步,默认是异步方式.

                     type : 'post',

                     data : dataJson,

                     url : "ListFriendFollow.action",

                     success : function(obj) {

                         obj =decodeURIComponent(obj);

                         obj = eval('('+obj+')');

                         $('#friendUl').text(''); //重置li

                         var listfriend = obj.data;

 

                         for(var i = 0 ; i < listfriend.length ; i++){

                            $('<li />').attr('onclick','javascript:TransferToUserid(this)').attr('id',listfriend[i].userid).text(listfriend[i].screenName).appendTo('#friendUl');

                         }

                     }

                  });

    }


<think>我们正在处理一个关于VueFlow插件的问题,用户希望知道如何使用backspace删除节点的事件处理方法。 根据用户的问题,我们需要在VueFlow中处理backspace事件来删除节点。 在VueFlow中,我们可以通过监听盘事件来实现。通常,我们会使用`useKeyPress`组合式API(如果VueFlow提供了的话)或者使用原生的盘事件监听。 但是,请注意,VueFlow本身可能没有直接提供删除节点的盘事件处理,因此我们需要自己实现。 步骤: 1. 我们需要在VueFlow的画布(Canvas)上监听盘事件。由于画布可能不是焦点元素,我们需要确保画布可聚焦(例如设置tabindex)。 2. 监听backspace码为8或KeyBackspace,但更推荐使用'Backspace')的按下事件。 3. 当事件触发时,获取当前选中的节点(因为用户可能希望删除选中的节点)。 4. 调用删除节点的方法(可能是从VueFlow的store中移除节点)。 另外,VueFlow提供了`useVueFlow`组合式API,我们可以通过它来获取节点和操作节点的方法。 示例思路: 首先,确保画布可以接收盘事件。我们可以给画布容器设置tabindex,然后监听keydown事件。 然后,在事件处理函数中,判断按下的是否为backspace,并且当前有选中的节点。 最后,使用`removeNodes`方法删除选中的节点。 代码示例: 假设我们有一个VueFlow的实例,我们可以在组件的setup中实现。 注意:为了避免删除系统按(比如当用户正在输入时),我们可能需要检查事件的目标元素是否是输入框等,如果是则跳过。 参考代码: ```vue <template> <div ref="containerRef" tabindex="0" style="width: 100%; height: 100vh"> <VueFlow v-model="elements" ... /> </div> </template> <script setup> import { ref, onMounted, onBeforeUnmount } from 'vue' import { VueFlow, useVueFlow } from '@braks/vueflow' const { removeNodes, getNodes } = useVueFlow() const containerRef = ref(null) // 选中的节点 const selectedNodes = ref([]) // 在VueFlow中,我们可以通过事件来更新选中的节点,例如'node-selected'和'node-unselected' // 但更简单的方式是:在盘事件中,我们获取当前选中的节点(通过store中的nodes,每个节点有一个selected属性) onMounted(() => { const container = containerRef.value if (container) { container.addEventListener('keydown', handleKeyDown) } }) onBeforeUnmount(() => { const container = containerRef.value if (container) { container.removeEventListener('keydown', handleKeyDown) } }) function handleKeyDown(event) { // 如果按下的是Backspace if (event.key === 'Backspace') { // 获取当前选中的节点 const nodesToRemove = getNodes.value.filter(node => node.selected) if (nodesToRemove.length > 0) { // 阻止默认行为,避免浏览器后退等操作 event.preventDefault() // 删除节点 removeNodes(nodesToRemove) } } } </script> ``` 注意:上述代码中,我们使用了`useVueFlow`提供的`removeNodes`方法和`getNodes`(注意:`getNodes`是一个ref,所以我们需要用`.value`获取当前值)。 另外,我们还需要在VueFlow实例中处理节点选中状态的变化。但是,在VueFlow中,节点的选中状态是存储在节点数据中的,所以我们通过过滤`selected`为true的节点即可。 但是,我们需要确保画布获得焦点。因为div设置了tabindex,所以点击画布区域就可以让div获得焦点,从而接收盘事件。 此外,为了避免删除操作与浏览器默认行为冲突(比如后退页面),我们在删除节点时调用`event.preventDefault()`。 以上是一个基本的实现。根据实际需求,可能还需要考虑其他情况,例如同时删除与节点相连的边等(VueFlow的removeNodes方法默认会删除与节点相连的边)。 另外,VueFlow的版本可能会影响API的使用,请根据实际使用的版本调整。 如果用户使用的是VueFlow的插件系统,也可以考虑封装成一个自定义插件。 相关问题: 1. 如何确保在删除节点前进行确认? 2. 如何同时删除与节点相连的边? 3. 如何避免在输入框等元素中按下Backspace时触发删除节点? 4. 在VueFlow中,如何自定义盘快捷? 下面生成相关问题。</think>在 VueFlow 中处理 Backspace 删除节点事件,可以通过以下步骤实现: ### 解决方案 1. **监听盘事件** 在 VueFlow 容器上添加 `@keydown` 监听器,捕获 Backspace 码 `8` 或 `'Backspace'`): ```vue <div @keydown="handleKeyDown" tabindex="0" <!-- 确保容器可聚焦 --> style="outline: none;" <!-- 移除聚焦边框 --> > <VueFlow :nodes="nodes" :edges="edges" /> </div> ``` 2. **事件处理逻辑** 在 `handleKeyDown` 方法中: - 检查按下的是否为 Backspace - 获取当前选中的节点 - 调用 VueFlow 的 `removeNodes` 删除节点 ```javascript import { useVueFlow } from '@vue-flow/core' const { removeNodes, getNodes } = useVueFlow() function handleKeyDown(event) { if (event.key === 'Backspace' || event.keyCode === 8) { event.preventDefault() // 阻止浏览器默认后退行为 const selectedNodes = getNodes.value.filter(node => node.selected) if (selectedNodes.length > 0) { removeNodes(selectedNodes) } } } ``` 3. **自动聚焦容器**(可选) 若需自动聚焦,在挂载时添加: ```javascript import { onMounted, ref } from 'vue' const containerRef = ref(null) onMounted(() => containerRef.value?.focus()) ``` 模板中绑定 `ref`: ```vue <div ref="containerRef" @keydown="handleKeyDown" tabindex="0"> <!-- VueFlow 画布 --> </div> ``` ### 关说明 - **焦点管理**:必须设置 `tabindex="0"` 使容器可接收盘事件 - **删除确认**:建议添加确认对话框(示例扩展): ```javascript function handleKeyDown(event) { if (event.key === 'Backspace') { const selectedNodes = getNodes.value.filter(n => n.selected) if (selectedNodes.length > 0 && confirm('删除选中节点?')) { removeNodes(selectedNodes) } } } ``` - **边缘情况**:当焦点在输入框时,应跳过删除操作: ```javascript if (event.target.tagName === 'INPUT') return ``` ### 完整示例 ```vue <template> <div ref="flowContainer" @keydown="handleKeyDown" tabindex="0" style="height: 100vh; outline: none;" > <VueFlow :nodes="nodes" :edges="edges" /> </div> </template> <script setup> import { ref, onMounted } from 'vue' import { useVueFlow } from '@vue-flow/core' const { removeNodes, getNodes } = useVueFlow() const flowContainer = ref(null) onMounted(() => flowContainer.value.focus()) function handleKeyDown(event) { // 跳过输入框的Backspace if (event.target.tagName === 'INPUT') return if (event.key === 'Backspace') { event.preventDefault() const selectedNodes = getNodes.value.filter(node => node.selected) if (selectedNodes.length > 0 && confirm(`确认删除 ${selectedNodes.length} 个节点?`)) { removeNodes(selectedNodes) } } } </script> ``` ---
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值