| Autor | Zpráva | ||
|---|---|---|---|
| o_O Profil |
#1 · Zasláno: 3. 10. 2011, 06:12:32 · Upravil/a: o_O
Dobrý den,
zajímalo by mě, zda lze zachytit vkládání (copy & paste) víceřádkových hodnot do inputu a především jak? (pouze javascript) Je jasné, že prohlížeč automaticky převede víceřádkový text na jeden řádek. Jediné, co mě napadá je zachytit zmáčknutí kláves CTRL+V, jakkoliv uložit do proměnné a pak s ní nadále pracovat. Jedná se mi o toto: V případě chatu se víceřádkový text zobrazí špatně, resp. text se narve na jeden řádek bez mezer, čímž způsobí špatnou čitelnost. Chtěl bych v takovémto případě dát návštěvníkovi možnost odeslat zprávu na Xkrát (například confirm-em). Předem díky za jakékoliv postrčení. |
||
| Darker Profil |
#2 · Zasláno: 4. 10. 2011, 19:43:36
V chatu to vyřeš přes PHP - zprávy prožeň funkcí nl2br.
|
||
| Chamurappi Profil |
#3 · Zasláno: 4. 10. 2011, 19:51:03
Reaguji na o_O:
V Internet Exploreru to jde jednoduše, chytneš událost onpaste a při ní se podíváš, co vrací metoda clipboardData.getData("Text").
V ostatních prohlížečích je zapotřebí odchytit stisk kláves Ctrl a V, vytvořit novou <textarea> (nějak schovanou, ale ne display: none), hodit do ní focus, počkat milisekundu, poznamenat si, co se vložilo, zrušit <textarea>, vrátit focus…
|
||
| o_O Profil |
#4 · Zasláno: 5. 10. 2011, 04:13:16
Darker:
„lze zachytit vkládání (copy & paste) víceřádkových hodnot do inputu a především jak? (pouze javascript)“ Chamurappi: Díky. |
||
| o_O Profil |
#5 · Zasláno: 5. 10. 2011, 17:18:48
Chamurappi:
Ještě jeden dotaz - je lepší napsat obě metody (jednu pro IE a druhou pro ostatní prohlížeče) - nebo bude rozumnější napsat jen ten druhý způsob? |
||
| Chamurappi Profil |
#6 · Zasláno: 5. 10. 2011, 18:39:25
Reaguji na o_O:
Událost onpaste je (již podle názvu) universálnější, umí zachytit i jiné postupy vkládání než Ctrl+V. Existují lidi (třeba já), kteří místo Ctrl+C a Ctrl+V dodnes používají Ctrl+Insert a Shift+Insert. To by ještě chytit šlo, ale vložení přes kontextové menu (přes to, které se ukáže při kliknutí pravým tlačítkem na formulářovém poli) už ničím jiným než onpastem nechytíš.
Rozumnější je použít oba způsoby. Ani není nutné testovat prohlížeč — při onpaste si po úspěšném clipboardData.getData("Text") zapamatuj, že už nemáš číhat na Ctrl+V.
|
||
|
Časová prodleva: 2 měsíce
|
|||
| o_O Profil |
#7 · Zasláno: 2. 12. 2011, 05:54:07 · Upravil/a: o_O
Chamurappi:
Tak jsem se k tomu nakonec dostal. function onPasteMsg(){
if(clipboardData.getData("Text")){
textik=clipboardData.getData("Text");
/*alert(textik);*/
textik=textik.split("\n");
if(textik.length>1){
alert("Zachyceno vkládání víceřádkového textu.");
/* ... */
}
}
}<input type="text" name="text" onpaste="onPasteMsg();" onKeyPress="GetKeyCode();"> S tímto takřka problém nebyl - vkládaný text lze zpracovat jednoduše. Pak ten horší způsob pro ostatní pr. Koukal jsem, jak je to řešené zde a mohl by mi někdo například poslat článek který pojednává o tomto zápisu funkcí? document.documentElement.onkeypress = window.onkeypress = function(e) Dotáhl jsem to tedy do této fáze: function GetKeyCode(e){
document.documentElement.onkeypress = window.onkeypress = function(e) {
var event = window.event || e;
var target = event.target || event.srcElement;
var key = (event.which + 1) ? event.which : event.keyCode;
if(key==118){ /* 118=CTRL+V */
var textTo=document.createElement("textarea");
document.getElementsByTagName('BODY')[0].appendChild(textTo);
textTo.focus();
}
}
}- v chrome a safari mi nefunguje ani jedna, v mozille obě (vytváří však 2 textarey), v opeře jen documentElement Zkoušel jsem alertovat, ale funkce GetKeyCode() se vůbec nezavolá. Můžete mě, prosím, nasměrovat správným směrem? Díky. |
||
|
Časová prodleva: 14 dní
|
|||
| o_O Profil |
#8 · Zasláno: 15. 12. 2011, 21:02:14 · Upravil/a: o_O
Tak už jsem na to přišel. Nevím proč, ale chrome a safari mi bere pouze onkeydown.
Výsledný script: var cleverP = window.clipboardData; // pro detekci MSIE / ostatní
function cleverPaste(){ // pouze MSIE
textik=clipboardData.getData("Text");
textik=textik.split("\n");
if(textik.length>1){
alert("Zachyceno vkládání víceřádkového textu.");
}
}
if(cleverP)
document["otevr"]["zprava"].onpaste = function() {cleverPaste();} // v případě MSIE volat jednodušší možnost
document.documentElement.onkeypress = window.onkeypress = window.onkeydown = function(e) { // ostatní prohlížeče
if(cleverP)return true;
var event = window.event || e;
var target = event.target || event.srcElement;
var key = (event.which + 1) ? event.which : event.keyCode;
if(target.tagName!="INPUT") // detekce inputu
return true;
if(target.name!="zprava" || target.id!="zprava_n") // detekce správného inputu
return true;
if(key==86 && event.ctrlKey){ // ctrl+v
var textTo=document.createElement("textarea");
textTo.style.cssText = 'width:0px;height:0px;position:absolute;left:-10000px;top:-10000px;';
document.body.appendChild(textTo);
textTo.focus();
setTimeout(function(){ // počkáme milisekundu
textik=textTo.value.split("\n");
if(textik.length>1){
alert("Zachyceno vkládání víceřádkového textu.");
}
textTo.parentNode.removeChild(textTo); // odstraníme vytvořenou textareu
},1);
}
return true;
};Nějaké výhrady, či připomínky? |
||
| Chamurappi Profil |
#9 · Zasláno: 15. 12. 2011, 21:40:12
Reaguji na o_O:
Některé konstrukce jsou mi fakt dost povědomé :-) „ale chrome a safari mi bere pouze onkeydown“ Ve všech prohlížečích se vyplatí používat spíš onkeydown. Já v djpw.js musel použít onkeypress, protože jinak některý z prohlížečů (tuším) nedovoloval stornovat výchozí akci (což ty nepotřebuješ).
„if(target.name!="zprava" || target.id!="zprava_n") // detekce správného inputu“ Proč nehlídáš onkeydown přímo na tom <input>u? Není přeci nutné chytat každou klávesu ve stránce. (Krom toho ji nejspíš v některých prohlížečích chytneš dvojmo, možná i trojmo.)
|
||
| o_O Profil |
#10 · Zasláno: 15. 12. 2011, 23:07:58 · Upravil/a: o_O
Chamurappi:
„Některé konstrukce jsou mi fakt dost povědomé :-)“ „použil jsem tedy zápis z DJPW (pokud nevadí)“ :) „Proč nehlídáš onkeydown přímo na tom <input>u?“ To je dobrá otázka, to by mě taky zajímalo. „dvojmo, možná i trojmo“ Semtam se mi podařilo vytvořit 3 textarey naráz, ale většinou jen dvě :) „vyplatí používat spíš onkeydown“ Dobré vědět, říct mi to před dvěmi týdny byl bych ovšem šťastnější. Málem jsem nad tím rezignoval. Budiž tedy. Nějak takto? <form name="otevr"> <input type="text" name="zprava" id="zprava_n" onkeydown="radky();"> </form> var cleverP = window.clipboardData; // pro detekci MSIE / ostatní
function cleverPaste(){ // pouze MSIE
textik=clipboardData.getData("Text");
textik=textik.split("\n");
if(textik.length>1){
alert("Zachyceno vkládání víceřádkového textu.");
}
}
if(cleverP)
document["otevr"]["zprava"].onpaste = function() {cleverPaste();} // v případě MSIE volat jednodušší možnost
function radky(){ // ostatní prohlížeče
window.onkeydown = function(e) {
if(cleverP)return true;
var event = window.event || e;
var target = event.target || event.srcElement;
var key = (event.which + 1) ? event.which : event.keyCode;
if(key==86 && event.ctrlKey){ // ctrl+v
var textTo=document.createElement("textarea");
textTo.style.cssText = 'width:0px;height:0px;position:absolute;left:-10000px;top:-10000px;';
document.body.appendChild(textTo);
textTo.focus();
setTimeout(function(){ // počkáme milisekundu
textik=textTo.value.split("\n");
if(textik.length>1){
alert("Zachyceno vkládání víceřádkového textu.");
}
textTo.parentNode.removeChild(textTo); // odstraníme vytvořenou textareu
},1);
}
return true;
};
}[OT]Když už máte tu supr fíčuru která umí odhalit vkládání kódu, mohli by jste ošetřit, zda se text nevkládá do již připraveného [ pre ][/OT] |
||
| Chamurappi Profil |
#11 · Zasláno: 16. 12. 2011, 19:32:26
Reaguji na o_O:
„Nějak takto?“ Ne. V momentě, kdy uživatel začne psát do <input>u, nastavíš, že chceš chytat všechny následující onkeydown na window — proč?
Když k <input>u dodáváš onpaste skriptem, tak už mu můžeš dodat stejným způsobem i onkeydown.
„mohli by jste ošetřit, zda se text nevkládá do již připraveného [>pre]“ Ošetřené to je, ale počítá to jen s [>pre], ne s [>prejs] a spol. — ano, to bych asi měl opravit.
|
||
|
Časová prodleva: 1 měsíc
|
|||
| Chamurappi Profil |
#12 · Zasláno: 18. 1. 2012, 18:51:46
Reaguji na o_O:
Možná ten postup s odchytávacím pracovním elementem <textarea> není optimální. Nevím, proč jsou s ním problémy, nedokážu je nasimulovat.
Nicméně napadla mě druhá, více selhánívzdorná možnost: Jakmile se odchytí Ctrl+V, nezasáhnu skriptem do přirozeného dění vůbec, nechám text normálně vložit, akorát se před tím podívám, co je momentálně před a za výběrem (před selectionStart a za selectionEnd). O milisekndu později se znovu mrknu na value a vyzobnu si s pomocí dříve zjištěných hranic výběru to, co se změnilo. Pak můžu vložený text také zanalyzovat a případně znovu celý označit a přepsat jiným textem.
Teď mě ale napadá, že tahle možnost asi není úplně použitelná v tvém případě, jelikož máš jako vstupní pole <input> a nikoliv <textarea>.
|
||
|
Časová prodleva: 15 let
|
|||
0