2008-11-12 10 views

Odpowiedz

7

Nie, obsługa JavaScript nie jest obsługiwana. A to obejście wydaje się bardzo problematyczne, ponieważ utracisz możliwość posiadania ukośników.

Sam wpadłem na ten problem, gdy potrzebowałem zbudować komunikat ostrzegawczy lub coś z zaplecza ASP.NET i wstawić go do alertu JavaScript z przodu. Problem polegał na tym, że programiści mogli wprowadzić cokolwiek w metodzie Page.Alert().

Co zrobiłem, aby rozwiązać ten problem był następujący:

public void Alert(string message) 
{ 
    message = message.Replace("\\", "\\\\") 
     .Replace("\r\n", "\n") 
     .Replace("\n", "\\n") 
     .Replace("\t", "\\t") 
     .Replace("\"", "\\\""); 

    // and now register my JavaScript with this safe string. 
} 
+2

Był to tylko przykład dobrze pasujący do danego pytania (ścieżka Windows). Możesz zastąpić/przez dowolny znak. – PhiLho

2

będę ponownie iteracji, co zostało powiedziane wcześniej - verbatim struny nie są możliwe w javascript. Łatwo jest uniknąć ważnych znaków ewakuacyjnych, takich jak \n \\ \t itd., Ale problem pochodzi z nieumiejętnych znaków z powodu sposobu, w jaki są one obsługiwane w różnych funkcjach, które stają się niekompatybilne. Na przykład

"\a".replace("\a","\\a")  // WORKS \a 
"aa\a".replace("\a", "\\a") // FAILS \aaa 

Także, jeśli spojrzeć na tablicę niedozwolonych znaków specjalnych np ["\a"] postać będzie po prostu wyglądać a. To sprawia, że ​​robienie tego, co chcesz, jest zasadniczo niemożliwe.

Mam nadzieję, że przynajmniej to wyczyści.

3

Big kludge stanowi obejście ...

<html> 
<head> 
<script> 
function foo() { 
    var string = document.getElementById('foo').innerHTML; 
    alert(string); 
} 
window.onload=foo; 
</script> 
<style> 
#foo{ 
    display: none; 
} 
</style> 
</head> 
<body> 
Calling foo on page load. 
<div id="foo">\\server\path\to\file.txt</div> 
</body> 
</html> 
+0

Ma to wiele efektów ubocznych, lepiej mieć nadzieję, że nie ma ich w łańcuchu. –

+3

@Juan Mendes: Nie rozumiesz, jaka część "Big kludge"? –

+8

Z Wikipedii: "Kludge (lub kluge) to obejście, szybkie i brudne rozwiązanie, niezdarne lub nieeleganckie, ** a jednak skuteczne ** ..." Twoje rozwiązanie powoduje błędne wyniki dzięki prostemu wprowadzeniu, nie nawet kwalifikuje się jako kludge. –

7

Szablon ciągi robić przerwy linię wsparcia.

`so you can 
do this if you want` 

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Template_literals

Nie ma oczywiście zapobiec występowaniu ekspansji in tekstu, a co za tym idzie, wykonanie kodu, ale może to dobrze?

Uwaga: Nie sądzę, istnieje sposób, aby podjąć istniejący ciąg i uruchomić go poprzez interpolację ekspresji. To uniemożliwia wstrzyknięcie kodu w ten sposób, ponieważ kod musi pochodzić ze źródła. Nie znam interfejsu API, który może wykonywać interpolację wyrazów na żądanie.

Uwaga 2: Ciągi szablonów to funkcja ES2015/ES6. Wsparcie w każdej przeglądarce oprócz (czekaj na to ...) IE! Jednak Edge obsługuje ciągi szablonów.

Uwaga 3: Ciągi szablonów rozwijają sekwencje ucieczki, jeśli w ciągu znaków ciąg znaków zawiera ciąg znaków, który rozszerza sekwencje specjalne.

`"A\nB"` 

... spowoduje:

"A 
B" 

...który nie zadziała z JSON.parse, ponieważ istnieje teraz nowa linia w literale łańcuchowym. Może być dobrze wiedzieć.

+0

Dzięki, to zadziałało dla mnie. Potrzebowałem szybkiej metody zdobywania kodów postaci do testowania i działało to dobrze. – Teorist

4

Jest to bardzo stary wątek, ale wciąż tu jest obejście:

function verbatim(fn){return fn.toString().match(/[^]*\/\*\s*([^]*)\s*\*\/\}$/)[1]} 

Który będzie używany jako to:

var myText = verbatim(function(){/*This 
is a multiline \a\n\0 verbatim line*/}) 

zasadzie to, co się dzieje, jest to, że js traktuje komentarze rzeczywiście jako ciągi znaków. Ponadto są one przechowywane wraz z funkcją. Tak więc, dzieje się tak, że tworzymy funkcję z kilkoma dosłownymi komentarzami, które wypakowujemy w funkcji dosłowności.

+0

Nie wiem, dlaczego wszyscy mówią o ucieczce postaci i zastępowaniu napisów, ponieważ wydaje się to być przeciwieństwem dosłownego - chociaż PO porównuje programowanie z JS, nie stwierdził, że potrzebuje interoperacyjności między nimi. Ta odpowiedź działa w elegancki i zaskakujący sposób - to rozjaśniło mój dzień! Ale tylko skopiowanie JS dało mi błąd "Nie można uzyskać właściwości" 1 "niezdefiniowanej lub zerowej referencji". Zmiana instrukcji return na 'return fn.toString(). Split ("/* ") [1] .split (" */") [0]' aby uzyskać tylko wszystko pomiędzy komentarzami zrobiłem to, czego potrzebuję. z podziękowaniami. – wunth

0

Wystarczy użyć String.raw()

String.raw`\n` 

wyjście wola

\\n 

Ale nie wiem jak rozwiązać sprawę:

String.raw`hello`hello` // It will throw an TypeError 
String.raw`hello\`hello` // Output is 'hello\\`hello' 

nie wiem jak radzić sobie z ` :(

Powiązane problemy