小编Tau*_*ren的帖子

JavaScript/jQuery通过POST使用JSON数据下载文件

我有一个基于jquery的单页webapp.它通过AJAX调用与RESTful Web服务进行通信.

我正在努力完成以下任务:

  1. 将包含JSON数据的POST提交到REST URL.
  2. 如果请求指定了JSON响应,则返回JSON.
  3. 如果请求指定了PDF/XLS/etc响应,则返回可下载的二进制文件.

我现在有1和2工作,客户端jquery应用程序通过基于JSON数据创建DOM元素来显示网页中返回的数据.从Web服务的角度来看,我也有#3工作,这意味着如果给出正确的JSON参数,它将创建并返回二进制文件.但我不确定在客户端javascript代码中处理#3的最佳方法.

是否有可能从这样的ajax调用中获取可下载的文件?如何让浏览器下载并保存文件?

$.ajax({
    type: "POST",
    url: "/services/test",
    contentType: "application/json",
    data: JSON.stringify({category: 42, sort: 3, type: "pdf"}),
    dataType: "json",
    success: function(json, status){
        if (status != "success") {
            log("Error loading data");
            return;
        }
        log("Data loaded!");
    },
    error: function(result, status, err) {
        log("Error loading data");
        return;
    }
});
Run Code Online (Sandbox Code Playgroud)

服务器响应以下标头:

Content-Disposition:attachment; filename=export-1282022272283.pdf
Content-Length:5120
Content-Type:application/pdf
Server:Jetty(6.1.11)
Run Code Online (Sandbox Code Playgroud)

另一个想法是生成PDF并将其存储在服务器上并返回包含该文件的URL的JSON.然后,在ajax成功处理程序中发出另一个调用,执行以下操作:

success: function(json,status) {
    window.location.href = json.url;
}
Run Code Online (Sandbox Code Playgroud)

但这样做意味着我需要对服务器进行多次调用,而我的服务器需要构建可下载的文件,将它们存储在某处,然后定期清理该存储区域.

必须有一种更简单的方法来实现这一目标.想法?


编辑:在查看$ .ajax的文档后,我看到响应dataType只能是其中之一xml, html, script, json, jsonp, text,所以我猜测没有办法使用ajax请求直接下载文件,除非我在使用中嵌入二进制文件@VinayC答案中建议的数据URI方案(这不是我想做的事情).

所以我想我的选择是:

  1. 不使用ajax而是提交表单帖子并将我的JSON数据嵌入到表单值中.可能需要搞乱隐藏的iframe等.

  2. 不使用ajax而是将我的JSON数据转换为查询字符串以构建标准GET请求并将window.location.href设置为此URL.可能需要在我的单击处理程序中使用event.preventDefault()以防止浏览器从应用程序URL更改. …

javascript ajax rest jquery

241
推荐指数
9
解决办法
34万
查看次数

jquery数据选择器

我需要根据存储在元素.data()对象中的值来选择元素.至少,我想使用选择器选择顶级数据属性,可能是这样的:

$('a').data("category","music");
$('a:data(category=music)');
Run Code Online (Sandbox Code Playgroud)

或者选择器可能采用常规属性选择器格式:

$('a[category=music]');
Run Code Online (Sandbox Code Playgroud)

或者以属性格式,但使用说明符指示它在.data():

$('a[:category=music]');
Run Code Online (Sandbox Code Playgroud)

我发现James Padolsey的实现看起来很简单,但很好.选择器格式化在该页面上显示的镜像方法.还有这个Sizzle补丁.

出于某种原因,我记得有一段时间回顾jQuery 1.4将包含对jquery .data()对象中值的选择器的支持.但是,现在我正在寻找它,我找不到它.也许这只是我看到的一个功能请求.是否有支持,我只是没有看到它?

理想情况下,我想使用点表示法支持data()中的子属性.像这样:

$('a').data("user",{name: {first:"Tom",last:"Smith"},username: "tomsmith"});
$('a[:user.name.first=Tom]');
Run Code Online (Sandbox Code Playgroud)

我还想支持多个数据选择器,其中只找到具有所有指定数据选择器的元素.常规jquery多选择器执行OR操作.例如,$('a.big, a.small')选择a带有类big或标签的标签small.我正在寻找一个AND,也许是这样的:

$('a').data("artist",{id: 3281, name: "Madonna"});
$('a').data("category","music");
$('a[:category=music && :artist.name=Madonna]');
Run Code Online (Sandbox Code Playgroud)

最后,如果数据选择器上有比较运算符和正则表达式功能,那将会很棒.所以$(a[:artist.id>5000])可能.我意识到我可能会做很多这样的事情filter(),但是有一个简单的选择器格式会很好.

有什么解决方案可以做到这一点?Jame的Padolsey是目前最好的解决方案吗?我主要关注的是性能,还有子属性点符号和多数据选择器等额外功能.是否有其他实现支持这些内容或以某种方式更好?

jquery jquery-selectors

183
推荐指数
8
解决办法
14万
查看次数

HTML5本地存储后备解决方案

我正在寻找可以localStorage在没有本机支持的浏览器上模拟的JavaScript库和代码.

基本上,我想使用localStorage存储数据编码我的网站,并知道它仍然适用于本机不支持它的浏览器.这意味着库将检测是否window.localStorage存在并且如果存在则使用它.如果它不存在,那么它将通过在window.localStorage命名空间中创建自己的实现来创建某种本地存储的回退方法.

到目前为止,我已经找到了这些解决方案:

  1. 简单的sessionStorage实现.
  2. 使用cookie的实现(对此想法不感兴趣).
  3. Dojo的dojox.storage,但这是它自己的事情,而不是真正的后备.

我知道Flash和Silverlight也可以用于本地存储,但是没有找到任何使用它们作为标准HTML5 localStorage的后备.也许谷歌Gears也有这个功能?

请分享您找到的任何相关库,资源或代码段!我对纯javascript或基于jquery的解决方案特别感兴趣,但我猜这不太可能.

javascript flash jquery html5 local-storage

113
推荐指数
5
解决办法
6万
查看次数

使用JERSEY输入和输出二进制流?

我正在使用Jersey实现一个主要检索和提供JSON编码数据的RESTful API.但我有一些情况需要完成以下事项:

  • 导出可下载的文档,例如PDF,XLS,ZIP或其他二进制文件.
  • 检索多部分数据,例如一些JSON和上传的XLS文件

我有一个基于JQuery的单页Web客户端,它可以为这个Web服务创建AJAX调用.目前,它不进行表单提交,并使用GET和POST(使用JSON对象).我应该使用表单发送数据和附加的二进制文件,还是可以使用JSON plus二进制文件创建多部分请求?

我的应用程序的服务层当前在生成PDF文件时创建ByteArrayOutputStream.通过Jersey将此流输出到客户端的最佳方法是什么?我已经创建了一个MessageBodyWriter,但我不知道如何从Jersey资源中使用它.这是正确的方法吗?

我一直在查看泽西岛附带的样本,但还没有找到任何说明如何做这些事情的东西.如果重要的是,我正在使用泽西与杰克逊做没有XML步骤的对象 - > JSON,并没有真正使用JAX-RS.

java jax-rs jersey

109
推荐指数
8
解决办法
14万
查看次数

jQuery或javascript来查找页面的内存使用情况

有没有办法找出网页或我的jquery应用程序使用了多少内存?

这是我的情况:

我正在使用jquery前端和一个以JSON提供数据的restful后端来构建数据量很大的webapp.页面加载一次,然后一切都通过ajax发生.

UI为用户提供了在UI中创建多个选项卡的方法,每个选项卡可以包含大量数据.我正在考虑限制他们可以创建的标签数量,但他们认为只有在内存使用量超过某个阈值时才限制它们会很好.

根据答案,我想做一些澄清:

  • 我正在寻找运行时解决方案(不仅仅是开发人员工具),以便我的应用程序可以根据用户浏览器中的内存使用情况确定操作.
  • 计算DOM元素或文档大小可能是一个很好的估计,但它可能非常不准确,因为它不包括事件绑定,data(),插件和其他内存数据结构.

javascript memory jquery memory-management

94
推荐指数
4
解决办法
5万
查看次数

使用java泛型迭代枚举值

我正在尝试找到一种在使用泛型时迭代枚举值的方法.不知道如何做到这一点或是否有可能.

以下代码说明了我想要做的事情.请注意,代码T.values()在以下代码中无效.

public class Filter<T> {
    private List<T> availableOptions = new ArrayList<T>();
    private T selectedOption;

    public Filter(T selectedOption) {
        this.selectedOption = selectedOption;
        for (T option : T.values()) {  // INVALID CODE
            availableOptions.add(option);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

以下是我将如何实例化Filter对象:

Filter<TimePeriod> filter = new Filter<TimePeriod>(TimePeriod.ALL);
Run Code Online (Sandbox Code Playgroud)

枚举定义如下:

public enum TimePeriod {
    ALL("All"), 
    FUTURE("Future"), 
    NEXT7DAYS("Next 7 Days"), 
    NEXT14DAYS("Next 14 Days"), 
    NEXT30DAYS("Next 30 Days"), 
    PAST("Past"),
    LAST7DAYS("Last 7 Days"), 
    LAST14DAYS("Last 14 Days"),
    LAST30DAYS("Last 30 Days"); 

    private final String name;

    private TimePeriod(String name) {
        this.name = name; …
Run Code Online (Sandbox Code Playgroud)

java generics enums enumeration

66
推荐指数
4
解决办法
4万
查看次数

如何获取javascript对象引用或引用计数?

如何获取对象的引用计数

  • 是否可以确定javascript对象是否有多个引用
  • 或者如果它除了我正在访问它的那个之外还有引用?
  • 或者甚至只是为了获得引用计数本身?
  • 我可以从javascript本身找到这些信息,还是需要跟踪我自己的参考计数器.

显然,对于我的代码访问对象,必须至少有一个引用它.但我想知道的是,是否有任何其他引用,或者我的代码是唯一访问它的地方.如果没有别的东西引用它,我希望能够删除该对象.

如果您知道答案,则无需阅读本问题的其余部分.以下只是一个让事情更加清晰的例子.


用例

在我的应用程序中,我有一个Repository名为的对象实例contacts,其中包含所有联系人的数组.还有多个Collection对象实例,例如 friends集合和coworkers集合.每个集合都包含一个数组,其中包含一组不同的项目contacts Repository.

示例代码

为了使这个概念更具体,请考虑下面的代码.Repository对象的每个实例都包含特定类型的所有项的列表.您可能拥有联系人存储库和单独的事件存储库.为了简单起见,您可以获取,添加和删除项目,并通过构造函数添加许多项目.

var Repository = function(items) {
  this.items = items || [];
}
Repository.prototype.get = function(id) {
  for (var i=0,len=this.items.length; i<len; i++) {
    if (items[i].id === id) {
      return this.items[i];
    }
  }
}
Repository.prototype.add = function(item) {
  if (toString.call(item) === "[object Array]") { …
Run Code Online (Sandbox Code Playgroud)

javascript garbage-collection reference

54
推荐指数
1
解决办法
2万
查看次数

用于版本控制和缩小javascript的Maven插件

单页Javascript应用程序

我已经构建了一个复杂的ajax驱动的单页webapp,它使用一个服务于JSON的RESTful后端Web服务.javascript被分成许多不同的文件,每个文件代表某种特征或组件.

虽然该服务已经进行了alpha测试,但我只是在没有缩小的情况下单独提供所有这些文件.但是现在我想推出测试版,我真的需要组合文件,缩小它们并对它们进行版本化.我想使用Maven将其添加到我的构建过程中.

Javascript文件类型

我正在使用以下"类型"的javascript文件,其中#3和#4是我关注的问题:

  1. 外部文件,例如来自Google CDN的jquery和jquery-ui.很少更改这些版本,可以手动处理.
  2. 我自己托管的Jquery插件,例如fullcalendar或ui-layout.同样,我很少将这些更新到新版本并可以手动处理它.
  3. 应用程序范围的JavaScript代码.自定义javascript,分布在许多文件中,偶尔可以更改.需要加载所有这些文件才能使应用程序正常工作.
  4. 特定于功能的JavaScript代码.在请求特定功能时按需加载的自定义JavaScript.此代码可能会频繁更改,并且在启动时不会加载.

建立目标

我想在构建过程中执行以下操作:

  • 将所有类型3的javascript文件连接在一起,缩小它们,并保存为具有版本号的单个文件.例如:app-2.0.6.min.js,其中2.0.6是maven项目版本.
  • 所有类型4文件都应单独缩小并保存为单独的文件,版本号在名称中.例如:feature-abc-56ab32de29.min.js,其中56ab32de29是该特定文件的版本号.
  • 使用<script>标记更新HTML文件以指向具有正确版本号的javascript文件.
  • 更新加载类型4功能javascript文件的Javscript文件以指向正确的版本.

问题

  • 是否有maven插件可以协助连接?

  • 有没有maven插件可以帮助缩小?理想情况下,我想使用Google Closure Compiler,但如果更简单,可以与其他人合作.

  • 是否有maven插件可以帮助进行版本控制?

  • 有没有办法让4型javascript文件具有独立的版本号?理想情况下,如果文件在版本2.0.5和2.0.6之间没有变化,则用户无需下载新版本,并且其缓存版本可以正常工作.我正在使用GIT进行源代码控制,那么有没有办法使用文件的GIT哈希码进行版本控制?

  • 有没有一种解决方案可以压缩常规HTML文件中内联的javascript而不会破坏HTML?

  • 是否有压缩和版本化我的CSS文件的解决方案?

javascript git build minify maven

51
推荐指数
2
解决办法
2万
查看次数

在Chrome中使用本地文件的jQuery getJSON问题

我有一个非常简单的测试页面,它使用jQuery的$ .getJSON和$ .ajax方法的XHR请求.同一页面在某些情况下有效,而在其他情况下则无效.特别是,它在Ubuntu上的Chrome中不起作用.

我正在使用Chrome 5.0.342.7测试版测试Ubuntu 9.10,使用Chrome 5.0.307.9测试版测试Mac OSX 10.6.2.

  • 当文件从Ubuntu/Chrome和Mac/Chrome安装在Web服务器上时,它可以正常工作(在此处试试).
  • 当文件安装在Mac/Chrome的本地硬盘驱动器上时(使用file:/// ...访问),它可以正常工作.
  • 当文件安装在Ubuntu/Chrome中的本地硬盘驱动器上时(文件:/// ...访问),它会失败.

可以从这里下载tar/gzip文件中的一小组3个文件:http: //issues.tauren.com/testjson/testjson.tgz

当它工作时,Chrome控制台会说:

XHR finished loading: "http://issues.tauren.com/testjson/data.json".
index.html:16Using getJSON
index.html:21
Object
result: "success"
__proto__: Object
index.html:22success
XHR finished loading: "http://issues.tauren.com/testjson/data.json".
index.html:29Using ajax with json dataType
index.html:34
Object
result: "success"
__proto__: Object
index.html:35success
XHR finished loading: "http://issues.tauren.com/testjson/data.json".
index.html:46Using ajax with text dataType
index.html:51{"result":"success"}
index.html:52undefined
Run Code Online (Sandbox Code Playgroud)

如果它不起作用,Chrome控制台将显示以下内容:

index.html:16Using getJSON
index.html:21null
index.html:22Uncaught TypeError: Cannot read property 'result' of null
index.html:29Using ajax with …
Run Code Online (Sandbox Code Playgroud)

ajax jquery json google-chrome

48
推荐指数
3
解决办法
10万
查看次数

Git分支命名为origin/HEAD - > origin/master

我对Git很新,但仍然掌握它.我刚刚开始与分支机构合作,并遇到了一些问题.

我有两个开发系统,一个是Ubuntu桌面和一个MacBookPro.我organizations在Ubuntu系统的一个新分支上做了很多工作,并执行了提交并推送到我的远程仓库.在这一点上,我有这些分支:

tauren@ubuntu:/projects$ git branch
  accounting
  master
* organizations

tauren@ubuntu:/projects$ git branch -r
  origin/accounting
  origin/master
  origin/organizations
  origin/superstar
Run Code Online (Sandbox Code Playgroud)

然后我切换到MBP拉新分支:

tauren@osx:/projects$ git branch
  accounting
* master

tauren@osx:/projects$ git branch -r
  origin/HEAD -> origin/master
  origin/accounting
  origin/master
  origin/superstar

tauren@osx:/projects$ git pull
   2e20a14..ef35730  accounting -> origin/accounting
   271a1a5..7e947ab  master     -> origin/master
 * [new branch]      organizations -> origin/organizations

tauren@osx:/projects$ git branch
* accounting
  master

tauren@osx:/projects$ git branch -r
  origin/HEAD -> origin/master
  origin/accounting
  origin/master
  origin/organizations
  origin/superstar
Run Code Online (Sandbox Code Playgroud)

所以我的问题是:

  1. 为什么MBP有一个分支origin/HEAD -> origin/master,但Ubuntu系统没有?那个分支是什么?
  2. 是否会git pull自动拉出所有新的远程分支?我以为我必须告诉它要拉的新分支的名称.如您所见,它在命令上拉出了远程 …

git

44
推荐指数
3
解决办法
4万
查看次数