2014-10-14 12 views
10

Czy istnieje przykład, w jaki sposób można użyć skanera kodów kreskowych firmy zxing na stronie internetowej?Używanie skanera kodów kreskowych zxing na stronie internetowej

Odnosząc się do tej dokumentacji: https://github.com/zxing/zxing/wiki/Scanning-From-Web-Pages

nie powinny następujące prace kodu test?

function Test1() 
 
{ 
 
\t $.ajax(
 
\t { 
 
     url: "zxing://scan/?ret=http%3A%2F%2Ffoo.com%2Fproducts%2F%7BCODE%7D%2Fdescription&SCAN_FORMATS=UPC_A,EAN_13", 
 
     success:function() 
 
\t \t { 
 
      alert("success"); 
 
     }, 
 
     error:function() 
 
\t \t { 
 
      alert("error"); 
 
     } 
 
    }); 
 
} 
 
\t 
 
function Test2() 
 
{ 
 
\t $.ajax(
 
\t { 
 
     url: "http://zxing.appspot.com/scan?ret=http%3A%2F%2Ffoo.com%2Fproducts%2F%7BCODE%7D%2Fdescription&SCAN_FORMATS=UPC_A,EAN_13", 
 
     success:function() 
 
\t \t { 
 
      alert("success"); 
 
     }, 
 
     error:function() 
 
\t \t { 
 
      alert("error"); 
 
     } 
 
    }); 
 
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script> 
 

 
<button id="button1" onClick="Test1();">Test 1</button> 
 
<br> 
 
<br> 
 
<button id="button2" onClick="Test2();">Test 2</button>

Wciąż otrzymuję "error" w moim Android 4.4.2 Samsung Galaxy TabPro i Samsung Galaxy S4. Próbowałem już przeglądarki czasowej, przeglądarki Chrome, Firefox i Dolphin.

Nawet http://zxing.appspot.com/scan nie działa, ponieważ zawsze prosi mnie o zainstalowanie (już zainstalowanej) aplikacji.

Każda pomoc będzie mile widziana.

Odpowiedz

17

ZXing nie jest przeznaczony do pracy z AJAX. Zamiast tego działa, otwierając przeanalizowany adres URL w domyślnej przeglądarce. Zachowanie przeglądarki jest głównie odpowiedzialne za wrażenia użytkownika od tego momentu.

W tym temacie zamieszczono kilka metod; niestety nie ma jednej metody, która zadziała dla każdej przeglądarki.

Niektóre przeglądarki, po otwarciu ich z wiersza poleceń, sprawdzają, czy adres URL jest już otwarty na innej karcie, a jeśli tak, użyje tej karty zamiast nowej. Spowoduje to zdarzenie "onhashchange", jeśli link zxing zawiera "zxing: // scan /? Ret = mytab.html # {CODE}".

Inne przeglądarki nie wykonują takiego sprawdzenia, dlatego uruchamiamy wiele kart, wszystkie mają ten sam adres URL (z wyjątkiem skrótu), a żaden z nich nie podnosi zdarzenia "hashchanged". W przypadku tych przeglądarek musimy ponownie użyć strony z pamięci podręcznej, jeśli to możliwe (aby zapobiec ruchowi sieciowemu przy każdym skanowaniu) i zmienić wartość localStorage na wartość skrótu. Jeśli przeglądarka jest w stanie nasłuchiwać zdarzenia "storage", możemy użyć tego do wyzwolenia kodu.

Poniższy kod działa z Chrome, wewnętrzną przeglądarką systemu Android i Firefox. Może działać z innymi, ale nie próbowałem. Jednym z zastrzeżeń Firefoksa jest jednak zamknięcie okna skanera tylko wtedy, gdy ustawienie about: config "dom.allow_scripts_to_close_windows" jest ustawione na "true".

** Zostało to zmodyfikowane, aby działało lepiej z wieloma stronami umożliwiającymi skanowanie, a teraz można używać różnych skrótów bez ingerencji w kod. **

NOWA WERSJA 12/19/16

<!DOCTYPE html> 
<HTML> 
<HEAD> 
<script type="text/javascript"> 

    if(window.location.hash.substr(1,2) == "zx"){ 
     var bc = window.location.hash.substr(3); 
     localStorage["barcode"] = decodeURI(window.location.hash.substr(3)) 
     window.close(); 
     self.close(); 
     window.location.href = "about:blank";//In case self.close isn't allowed 
    } 
</script> 
<SCRIPT type="text/javascript" > 
    var changingHash = false; 
    function onbarcode(event){ 
     switch(event.type){ 
      case "hashchange":{ 
       if(changingHash == true){ 
        return; 
       } 
       var hash = window.location.hash; 
       if(hash.substr(0,3) == "#zx"){ 
        hash = window.location.hash.substr(3); 
        changingHash = true; 
        window.location.hash = event.oldURL.split("\#")[1] || "" 
        changingHash = false; 
        processBarcode(hash); 
       } 

       break; 
      } 
      case "storage":{ 
       window.focus(); 
       if(event.key == "barcode"){ 
        window.removeEventListener("storage", onbarcode, false); 
        processBarcode(event.newValue); 
       } 
       break; 
      } 
      default:{ 
       console.log(event) 
       break; 
      } 
     } 
    } 
    window.addEventListener("hashchange", onbarcode, false); 

    function getScan(){ 
     var href = window.location.href; 
     var ptr = href.lastIndexOf("#"); 
     if(ptr>0){ 
      href = href.substr(0,ptr); 
     } 
     window.addEventListener("storage", onbarcode, false); 
     setTimeout('window.removeEventListener("storage", onbarcode, false)', 15000); 
     localStorage.removeItem("barcode"); 
     //window.open (href + "#zx" + new Date().toString()); 

     if(navigator.userAgent.match(/Firefox/i)){ 
      //Used for Firefox. If Chrome uses this, it raises the "hashchanged" event only. 
      window.location.href = ("zxing://scan/?ret=" + encodeURIComponent(href + "#zx{CODE}")); 
     }else{ 
      //Used for Chrome. If Firefox uses this, it leaves the scan window open. 
      window.open ("zxing://scan/?ret=" + encodeURIComponent(href + "#zx{CODE}")); 
     } 
    } 

    function processBarcode(bc){ 
     document.getElementById("scans").innerHTML += "<div>" + bc + "</div>"; 
     //put your code in place of the line above. 
    } 

</SCRIPT> 
<META name="viewport" content="width=device-width, initial-scale=1" /> 
</HEAD> 
<BODY> 
<INPUT id=barcode type=text > 
<INPUT style="width:100px;height:100px" type=button value="Scan" onclick="getScan();"> 
<div id="scans"></div> 
</BODY> 
</HTML> 

Można zrobić JS zawierać plik dla górnego bloku skryptu, i umieścić go na wszystkich stronach, gdzie trzeba możliwości skanowania.

Następnie w treści dokumentu można ustawić zdarzenie gdzieś, aby wywołać metodę getZxing(), która wywoła processBarcode (kod kreskowy), który napiszesz na swojej stronie. W zestawie jest prosty na przykład.

Notatka boczna: Po pierwszym uruchomieniu zxing ze strony, zostaniesz poproszony o wybranie domyślnej aplikacji.Upewnij się, że wybrałeś tę samą przeglądarkę, z której korzystasz. Dodatkowo, jeśli wcześniej wybrałeś domyślny program do zxing i chcesz zmienić przeglądarkę, której używasz do zxing, musisz wyczyścić domyślne ustawienia z innych przeglądarek.

Podziękowania dla @ sean-owen za jego ciężką pracę i fantastyczny produkt.

AKTUALIZACJA 12/19/16

Ok, zrobiłem nieco bardziej solidną wersję, która działa dobrze z Firefox i Chrome. Kilka rzeczy, które odkryłem:

Chrome użyje zdarzenia Storage, jeśli skaner nie jest skonfigurowany do automatycznego uruchamiania Chrome i będzie używał zdarzenia Hash po tym, jak stanie się domyślnym.

Firefox nigdy nie użyje zdarzenie Hash, ale otwiera się dodatkowe okno, chyba że nazywają skaner z window.location.href (dzięki, @Roland)

Istnieje kilka innych anomalii, ale nie wyłączniki ofertę.

Zostawiłem prefiks "zx" w haszcie, tak aby kod mógł odgraniczać skróty skanera i zwykłe skróty. Jeśli go tam zostawisz, nie zauważysz tego w funkcji processBarcode, a skróty inne niż zx będą działały zgodnie z oczekiwaniami.

+0

Czy możesz udostępnić próbną próbkę? Byłoby świetnie –

+0

@ Mo-Prog, WRESZCIE zawarłem działający przykład. Przepraszamy za 10-tygodniowe opóźnienie! Poprawiłem też nieco kod, aby zapobiec wielu słuchaczy. – alfadog67

+0

Korzystanie z wydarzenia pamięci masowej to genialny pomysł, dziękuję ci za udostępnienie tej sztuczki! :) –

Powiązane problemy