据我所知,Firefox浏览器的“另存为..”功能也使用此功能,因此我尝试在代码中实现此功能。

除了保存的CSS和javascript文件外,其他所有程序都运行良好。它们包含奇怪的数字。 Firefox的“另存为..”不执行此操作。我做错什么了吗?

我做了什么:

webBrowserPersist.saveDocument(content.document, file, dir, null, null, null);


我错过了什么?我应该更改MIME或编码标志吗? (顺便说一句,我不理解这些第四和第五参数)

提前致谢。

最佳答案

https://developer.mozilla.org/en-US/docs/Mozilla/Tech/XPCOM/Reference/Interface/nsIWebBrowserPersist#saveDocument%28%29

第四个参数用于放置编码标志。因此,从上面的页面(我们寻找其中包含单词encode的标志),我们可以像这样传递给它:

persist = Components.classes["@mozilla.org/embedding/browser/nsWebBrowserPersist;1"].createInstance(Components.interfaces.nsIWebBrowserPersist);

persist.saveDocument(gBrowser.contentDocument, localFile, dataPath, persist.ENCODE_FLAGS_ENCODE_BASIC_ENTITIES, null, null);


第五,其格式化标志。我们可以通过按位运算符或运算符来使用倍数,例如:

persist = Components.classes["@mozilla.org/embedding/browser/nsWebBrowserPersist;1"].createInstance(Components.interfaces.nsIWebBrowserPersist);

persist.saveDocument(gBrowser.contentDocument, localFile, dataPath, null, persist.PERSIST_FLAGS_FORCE_ALLOW_COOKIES | persist.PERSIST_FLAGS_BYPASS_CACHE, null);


像那样的东西

最后一个参数是关于如何包装它的。我猜有一些包装标志。也许尝试传递一个数字。

工作示例:

var file = "c:\\test2.htm";
var data = "c:\\test2_data";
localFile = Components.classes["@mozilla.org/file/local;1"]
           .createInstance(Components.interfaces.nsILocalFile);
localFile.initWithPath(file)

dataPath = Components.classes["@mozilla.org/file/local;1"]
          .createInstance(Components.interfaces.nsILocalFile)
dataPath.initWithPath(data)

persist = Components.classes["@mozilla.org/embedding/browser/nsWebBrowserPersist;1"]
         .createInstance(Components.interfaces.nsIWebBrowserPersist);

persist.saveDocument(gBrowser.contentDocument, localFile, dataPath, null, null, null);


被窃取自:https://github.com/aptana/Jaxer/blob/f7994fc75a768c9873f094e29868c22e88b46b50/server/src/mozilla/embedding/qa/jstests/nsIWebBrowserPersistTest2.txt#L77



顺便说一下,这是保存我们功能从菜单中使用的功能:

/*
function saveDocument(aDocument, aSkipPrompt)
{
  if (!aDocument)
    throw "Must have a document when calling saveDocument";

  // We want to use cached data because the document is currently visible.
  var ifreq =
    aDocument.defaultView
             .QueryInterface(Components.interfaces.nsIInterfaceRequestor);

  var contentDisposition = null;
  try {
    contentDisposition =
      ifreq.getInterface(Components.interfaces.nsIDOMWindowUtils)
           .getDocumentMetadata("content-disposition");
  } catch (ex) {
    // Failure to get a content-disposition is ok
  }

  var cacheKey = null;
  try {
    cacheKey =
      ifreq.getInterface(Components.interfaces.nsIWebNavigation)
           .QueryInterface(Components.interfaces.nsIWebPageDescriptor);
  } catch (ex) {
    // We might not find it in the cache.  Oh, well.
  }

  internalSave(aDocument.location.href, aDocument, null, contentDisposition,
               aDocument.contentType, false, null, null,
               aDocument.referrer ? makeURI(aDocument.referrer) : null,
               aDocument, aSkipPrompt, cacheKey);
}
*/


saveDocument(gBrowser.contentDocument, true)

这是保存菜单项使用的功能。

关于javascript - NSIWebBrowserPersist的saveDocument()函数,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/24570831/

10-11 12:31