2012-02-15 13 views
13

के अंदर स्थानीय जावास्क्रिप्ट फ़ाइलों को लोड करने के साथ समस्या मुझे एक समस्या थी जिसने मुझे दिनों तक पीड़ा दी है। यह पता चला कि यह एक एंड्रॉइड गड़बड़ था और इसे प्रस्तुत, पुष्टि, और उम्मीद है कि भविष्य में रिलीज में तय किया जाएगा। अब मुझे एक समाधान मिला है जो मेरे लिए काम करता है, और इसे नीचे प्रदान करेगा, हालांकि समाधान सही नहीं है क्योंकि इसमें फोन अंतराल स्रोत को संपादित करना शामिल है। मुख्य रूप से मेरा सवाल यह है कि अगर कोई इस मुद्दे का बेहतर समाधान ढूंढ सकता है।वेबव्यू

बग:
एंड्रॉइड 3.0+ पर वेबव्यू के अंदर एक पृष्ठ लोड करने का प्रयास करते समय एक गड़बड़ है। गड़बड़ यह है कि यदि वह पृष्ठ किसी भी स्थानीय जावास्क्रिप्ट फ़ाइलों का संदर्भ देता है, तो आप क्वेरी डेटा को यूआरएल में जोड़ नहीं सकते हैं। मूल रूप से

यह काम करता है:
<script type="text/javascript" src="StaticJS.js"></script>

यह काम नहीं करता:
<script type="text/javascript" src="StaticJS.js?var=val"></script>

क्यों नरक किसी को भी स्पष्ट रूप से फ़ाइल के बाद से यह करने के लिए क्वेरी Vals साथ कुछ नहीं कर सकते चाहेगा? मेरे लिए मेरे पास एक फोनगैप एप्लिकेशन है जो JSONP के माध्यम से सेटिंग्स फ़ाइल लोड करता है, हालांकि यदि कोई सेटिंग फ़ाइल निर्दिष्ट नहीं है तो यह स्थानीय फ़ाइल में डिफ़ॉल्ट हो जाती है। तो हाँ, फ़ाइल क्वेरी डेटा को संसाधित नहीं कर सकती है, लेकिन उसी फ़ाइल प्रारूप और लोडिंग संरचना का उपयोग करना अच्छा होगा।


समाधान 1 (गैर-PhoneGap)

तो वहाँ इस के लिए एक आसान समाधान है अगर लक्ष्य एंड्रॉयड प्लेटफॉर्म 11 (Honeycomb) है या उच्चतर। (जब तक आप सावधान रहें और किसी भी विधि का उपयोग न करें जो किसी भी कम एपीआई स्तरों में मौजूद न हो, यह कोड < 11 एपीआईएस पर चलाएगा, लेकिन आपको अभी भी 11 को अपने लक्ष्य के रूप में सेट करना होगा)

मूल रूप से आप जोड़ते हैं WebViewClient को वेब व्यू में जो क्वेरी इंडेक्स के साथ स्थानीय जेएस फ़ाइलों को लोड करने में अवरोध करने के लिए चाहिएइंटरसेप्टरक्वेट विधि का उपयोग करता है।

import java.io.IOException; 
import java.io.InputStream; 

import android.content.res.AssetManager; 
import android.webkit.WebResourceResponse; 
import android.webkit.WebView; 
import android.webkit.WebViewClient; 

public class PatchingWebViewClient extends WebViewClient{ 

    AssetManager am; 

    public PatchingWebViewClient(AssetManager am){ 
     this.am = am; 
    } 

    @Override 
    public WebResourceResponse shouldInterceptRequest (WebView view, String url){ 
     if(url.indexOf("file:///android_asset") == 0 && url.contains("?")){ 
      String filePath = url.substring(22, url.length()); 
      filePath = filePath.substring(0, filePath.indexOf("?")); 
      try { 
       InputStream is = am.open(filePath); 
       WebResourceResponse wr = new WebResourceResponse("text/javascript", "UTF-8", is); 
       return wr; 
      } catch (IOException e) { 
       return null; 
      } 
     }else{ 
      return null; 
     } 
    } 

} 

WebViewClient सेट करने के लिए अपने कोड कुछ इस तरह दिखेगा:

import android.app.Activity; 
import android.os.Bundle; 
import android.webkit.WebView; 

public class CanWeBreakAWebViewActivity extends Activity { 
    WebView mWebView; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 

     mWebView = (WebView) findViewById(R.id.webview); 
     mWebView.getSettings().setJavaScriptEnabled(true); 
     mWebView.setWebViewClient(new PatchingWebViewClient(this.getAssets())); 
     mWebView.loadUrl("file:///android_asset/index.html"); 
    } 
} 

समाधान 2 (PhoneGap)

अब Phonegap के लिए मैं एक साफ समाधान नहीं ।

@Override 
public WebResourceResponse shouldInterceptRequest (WebView view, String url){ 
    if(url.indexOf("file:///android_asset") == 0 && url.contains("?")){ 
     String filePath = url.substring(22, url.length()); 
     filePath = filePath.substring(0, filePath.indexOf("?")); 
     try { 
      InputStream is = ctx.getAssets().open(filePath); 
      WebResourceResponse wr = new WebResourceResponse("text/javascript", "Cp1252", is); 
      return wr; 
     } catch (IOException e) { 
      return null; 
     } 
    }else{ 
     return null; 
    } 
} 

समाधान 3 (न के बराबर)

यह समाधान उम्मीद है कि कुछ आसान होगा शामिल करने के लिए: मेरा समाधान जाने के लिए और Phonegap स्रोत डाउनलोड करने और निम्न विधि जोड़कर CordovaWebViewClient संपादित करने के लिए है क्लास या मुख्य गतिविधि में ट्विक करें ताकि आप फोन के अंतराल का उपयोग कर सकें लेकिन कोड की एक .jar फ़ाइल का उपयोग कर सकते हैं, जिससे उन्नयन आसान हो जाता है।

उत्तर

1

ब्राउज़र डेटा कैशिंग को रोकने के लिए क्वेरी डेटा जावास्क्रिप्ट फ़ाइलों (और अन्य फ़ाइल प्रकारों जैसे सीएसएस) में जोड़ा गया है। क्वेरी डेटा फ़ाइल के लिए बेकार है लेकिन ब्राउजर इसे नए मानता है क्योंकि स्थान बदल जाता है (ब्राउज़र की आंखों में) और यह एक ताजा प्रति लोड करता है।

मुझे खुशी है कि आपको अपनी समस्या का उत्तर मिला, मैंने सोचा कि मैं अपना इनपुट दूंगा कि लोग इस विधि का उपयोग क्यों करते हैं।

+0

यहां समस्या ब्राउज़र कैशिंग नहीं है, लेकिन तथ्य यह है कि यदि आप क्वेरी डेटा संलग्न करते हैं तो फ़ाइलें लोड नहीं होतीं – jtymann

+0

समझा जाता है। जब मैंने आपके प्रश्न के इस हिस्से को देखा तो बस मदद करना चाहता था: "कोई भी ऐसा क्यों करना चाहेगा क्योंकि फ़ाइल स्पष्ट रूप से क्वेरी वॉल्स के साथ कुछ भी नहीं कर सकती है?" –

2

इस पोस्ट के लिए धन्यवाद, आपने मुझे नवीनतम समाधान में चिपकाया जो कि IceCreamCordovaWebViewClient का उपयोग करने के लिए है।

@Override 
    public void init() { 
    super.init(webView, new IceCreamCordovaWebViewClient(this, webView), new CordovaChromeClient(this, webView)); 
}