<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>test</title>
</head>
<body>
a1:<input type="text" name="a1" draggable="true" value="https://bbs.csdn.net/topics/aaa"><br>
a2:<input type="text" name="a2" draggable="true" value="https://bbs.csdn.net/topics/bbb">
</body>
</html>
如題,上面的代碼在input中加上draggable屬性后,內容就不能用滑鼠選中了。
這個問題怎么解決,有大神給個解決辦法嗎?
uj5u.com熱心網友回復:
拖動和選擇的行為有沖突,我有個變通的方法,你看看適不適用。在input前面的文字觸發div拖動事件,當點擊文字,div變成可拖動,當松開滑鼠,div變為不可拖動。
<div ondragend="this.draggable=false">
<span onmousedown="this.parentNode.draggable=true" onmouseup="this.parentNode.draggable=false">a1:</span>
<input type="text" name="a1" value="https://bbs.csdn.net/topics/aaa">
</div>
uj5u.com熱心網友回復:
謝謝回答,雖然這個方法直接選擇input的內容倒是可以,但是我一拖動div,也就是【a1】的時候,就再也不能用滑鼠選中input的內容了。
有沒有別的方法呢?
uj5u.com熱心網友回復:
你是不是div的ondragend屬性沒設定,因為拖動結束后,得把div的dragable置回false,這樣input才能進行選擇文字。
uj5u.com熱心網友回復:
拖動和選擇的行為有沖突,我有個變通的方法,你看看適不適用。
在input前面的文字觸發div拖動事件,當點擊文字,div變成可拖動,當松開滑鼠,div變為不可拖動。
<div ondragend="this.draggable=false">
<span onmousedown="this.parentNode.draggable=true" onmouseup="this.parentNode.draggable=false">a1:</span>
<input type="text" name="a1" value="https://bbs.csdn.net/topics/aaa">
</div>
謝謝回答,雖然這個方法直接選擇input的內容倒是可以,但是我一拖動div,也就是【a1】的時候,就再也不能用滑鼠選中input的內容了。
有沒有別的方法呢?
你是不是div的ondragend屬性沒設定,因為拖動結束后,得把div的dragable置回false,這樣input才能進行選擇文字。
我沒有這樣做,我需要實作的效果是拖動一個input的內容到另一個input。所以需要在input上設定draggable="true",來實作拖動效果。
還有這個是IE11上做的。
有沒有更好的辦法呢?
uj5u.com熱心網友回復:
我沒有這樣做,我需要實作的效果是拖動一個input的內容到另一個input。所以需要在input上設定draggable="true",來實作拖動效果。
還有這個是IE11上做的。
有沒有更好的辦法呢?
拖動內容的話,什么都不用加的
uj5u.com熱心網友回復:
1.首先在vue專案中創建一個js檔案eg:dialog.jsimport Vue from 'vue'
// v-dialogDrag: 彈窗拖拽屬性
Vue.directive('dialogDrag', {
bind (el, binding, vnode, oldVnode) {
// 自定義屬性,判斷是否可拖拽
if (!binding.value) return
const dialogHeaderEl = el.querySelector('.el-dialog__header')
const dragDom = el.querySelector('.el-dialog')
dialogHeaderEl.style.cssText += ';cursor:move;'
dragDom.style.cssText += ';top:0px;'
// 獲取原有屬性 ie dom元素.currentStyle 火狐谷歌 window.getComputedStyle(dom元素, null);
const sty = (function () {
if (document.body.currentStyle) {
// 在ie下兼容寫法
return (dom, attr) => dom.currentStyle[attr]
} else {
return (dom, attr) => getComputedStyle(dom, false)[attr]
}
})()
dialogHeaderEl.onmousedown = (e) => {
// 滑鼠按下,計算當前元素距離可視區的距離
const disX = e.clientX - dialogHeaderEl.offsetLeft
const disY = e.clientY - dialogHeaderEl.offsetTop
const screenWidth = document.body.clientWidth // body當前寬度
const screenHeight = document.documentElement.clientHeight // 可見區域高度(應為body高度,可某些環境下無法獲取)
const dragDomWidth = dragDom.offsetWidth // 對話框寬度
const dragDomheight = dragDom.offsetHeight // 對話框高度
const minDragDomLeft = dragDom.offsetLeft
const maxDragDomLeft = screenWidth - dragDom.offsetLeft - dragDomWidth
const minDragDomTop = dragDom.offsetTop
const maxDragDomTop = screenHeight - dragDom.offsetTop - dragDomheight
// 獲取到的值帶px 正則匹配替換
let styL = sty(dragDom, 'left')
// 為兼容ie
if (styL === 'auto') styL = '0px'
let styT = sty(dragDom, 'top')
console.log(styL)
// 注意在ie中 第一次獲取到的值為組件自帶50% 移動之后賦值為px
if (styL.includes('%')) {
styL = +document.body.clientWidth * (+styL.replace(/%/g, '') / 100)
styT = +document.body.clientHeight * (+styT.replace(/%/g, '') / 100)
} else {
styL = +styL.replace(/px/g, '')
styT = +styT.replace(/px/g, '')
};
document.onmousemove = function (e) {
// 通過事件委托,計算移動的距離
let left = e.clientX - disX
let top = e.clientY - disY
// 邊界處理
if (-(left) > minDragDomLeft) {
left = -(minDragDomLeft)
} else if (left > maxDragDomLeft) {
left = maxDragDomLeft
}
if (-(top) > minDragDomTop) {
top = -(minDragDomTop)
} else if (top > maxDragDomTop) {
top = maxDragDomTop
}
// 移動當前元素
dragDom.style.cssText += `;left:${left + styL}px;top:${top + styT}px;`
}
document.onmouseup = function (e) {
document.onmousemove = null
document.onmouseup = null
}
return false
}
}
})
Vue.directive('dialogChange', {
bind (el, binding, vnode, oldVnode) {
// 自定義屬性,判斷是否可拉伸
if (!binding.value) return
const dragDom = el.querySelector('.el-dialog')
let dragMouse
// 在彈出框的右下角添加可拉伸標志 class='mouse'
for (let i = 0; i < dragDom.childNodes[2].childNodes.length; i++) {
if (dragDom.childNodes[2].childNodes[i].className === 'mouse') {
dragMouse = dragDom.childNodes[2].childNodes[i]
}
}
// 滑鼠拖拽
dragMouse.onmousedown = (e) => {
// content區域
const content = dragDom.parentNode.parentNode.parentNode.parentNode
const disX = e.clientX - dragDom.offsetWidth
const disY = e.clientY - dragDom.offsetHeight
document.onmousemove = function (e) {
e.preventDefault() // 移動時禁用默認事件
// 通過事件委托,計算移動的距離
let width = e.clientX - disX
let height = e.clientY - disY
if (width > content.offsetWidth && height < content.offsetHeight) {
dragDom.style.height = `${height}px`
} else if (width < content.offsetWidth && height > content.offsetHeight) {
dragDom.style.width = `${width}px`
} else if (width < content.offsetWidth && height < content.offsetHeight) {
dragDom.style.width = `${width}px`
dragDom.style.height = `${height}px`
}
}
document.onmouseup = function (e) {
document.onmousemove = null
document.onmouseup = null
}
return false
}
}
})
2.在main.js中參考:import './components/dialog'
3.在el-dialog加這個屬性v-dialogDrag:{dialogDrag}='dialog.dialogDrag'
4.在data里面引入變數 dialog: {// dialog顯示隱藏
dialogDrag: true, // 可拖拽
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/51614.html
標籤:HTML5
