[英]Can I use drag and drop of html5 on mobile devices with phonegap?
[英]What format (MIME Type) should I use for HTML5 drag and drop operations?
我開始嘗試使用HTML5 Drag and Drop。 然后,在dragstart事件處理程序中,我們應該運行setData()
,它接收兩個參數: format和data 。
function dragstart_handler(ev) {
ev.dataTransfer.setData('text/plain', 'foobar');
}
我想在我的Web應用程序中將某種“對象”從一個容器拖到另一個容器中。 通過“對象”,我指的是具有多個屬性(顏色,文本,作者,日期......)的東西。
我應該使用什么樣的格式 (或MIME類型)?
text/plain
? text/x-myapp-myobjtype
? application/x-myapp-myobjtype
? application/x-myapp.myobjtype+json
? 我應該如何編碼我的對象( setData()
的數據參數)?
(我意識到“如何為拖放操作一個對象”可能是另一個問題,但它與MIME類型的選擇密切相關)
一些參考:
HTML5規范有一些拖放示例(請參閱當前工作草案或最新版本 )。 在此類示例中,使用自定義MIME類型,並且還建議使用特定於站點的MIME類型。 看到這個片段:
<p>Drop your favorite fruits below:</p>
<ol dropzone="move s:text/x-example" ondrop="dropHandler(event)">
<-- don't forget to change the "text/x-example" type to something
specific to your site -->
</ol>
<script>
var internalDNDType = 'text/x-example'; // set this to something specific to your site
[...]
所以,這很好,這意味着我們應該使用自定義MIME類型! (除非我們實際上是拖動純文本,或只是一個URL,或者已經有一個眾所周知類型的東西)
但是我們如何創建這樣的自定義MIME類型?
我沒有找到關於此的文檔,因此我查看了其他MIME類型。 文本媒體類型列表沒什么特別之處,但應用媒體類型列表非常有趣。 讓我從該列表中獲取一個示例:
application/atom+xml
application/xhtml+xml
application/xmpp+xml
application/vnd.google-earth.kml+xml
application/vnd.google-earth.kmz
application/vnd.iptc.g2.newsitem+xml
application/vnd.iptc.g2.packageitem+xml
application/vnd.nokia.iptv.config+xml
application/vnd.openxmlformats-officedocument.wordprocessingml.footnotes+xml
application/vnd.yamaha.openscoreformat.osfpvg+xml
application/vnd.hal+json
application/vnd.hal+xml
我可以注意到一個制作名字的模式:
config
是iptv
子iptv
,即nokia
子vnd
,即vnd
子vnd
)。 google-earth
和openxmlformats-officedocument
)。 +json
和+xml
)。 x-
前綴應該用於未在IANA注冊的MIME類型(因此,未在該列表中顯示)。 根據這些規則,我可以建議使用以下MIME類型:
application / x-mysite.myobject + json (或application / x-mysite.parentobject.childobject + json )
這似乎是為以JSON編碼的Web應用程序對象指定自定義MIME類型的最精確和最正確的方法。
更新:自版本19以來,此Chrome錯誤已得到修復。
如果我的目標是支持谷歌Chrome (現在版本12是最新版本),那么我必須堅持使用text/plain
。
那是因為Chrome不正確地實現了dataTransfer對象 ,並且有一個關於dataTransfer無法處理非文本或url的漏洞。
我在jsFiddle寫了一個簡單的desmontration 。 它在Mozilla Firefox 3.6中甚至在Arora瀏覽器 (版本0.10.2,WebKit版本533.3)中都能正常工作。 為了完整起見,我的Chrome版本是12.0.742.112(WebKit版本534.30)。 演示代碼也可在下面找到:
<div id="drag" draggable="true">Drag me!</div>
<div id="drop">Drop here!</div>
#drag, #drop {
padding: 1em 2em;
margin: 1em 0;
}
#drag {
background: #CFC;
}
#drop {
background: #FCC;
}
function dragstart_handler(ev) {
console.log('dragstart');
ev.dataTransfer.setData('text/x-example', 'Foobar');
}
function dragover_handler(ev) {
// Accepting whatever is dragged over here
ev.preventDefault();
}
function drop_handler(ev) {
console.log('drop');
console.log(ev.dataTransfer.types);
if (ev.dataTransfer.types) {
var i;
for (i = 0; i < ev.dataTransfer.types.length; i++) {
var type = ev.dataTransfer.types[i];
console.log(type, ev.dataTransfer.getData(type));
}
}
console.log(ev.dataTransfer.getData('text/x-example'));
}
var drag = document.getElementById('drag');
drag.addEventListener('dragstart', dragstart_handler, false);
var drop = document.getElementById('drop');
drop.addEventListener('dragover', dragover_handler, false);
drop.addEventListener('drop', drop_handler, false);
使用'application / json'作為您可能喜歡的任何其他元數據的包裝器,包括mime類型的鏈接文件,或者您要在瀏覽器中使用的html。
{ 'assets': [
{
'color': 'foo',
'text': 'bar',
'uri': 'http://', // location of asset
'type': 'application/zip', // mime-type of asset
'html': '<div>html representation</div>'
// .. more properties
}
// ...more assets
]
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.