如何在Javascript中获取给定URL的内容类型?

时间:2013-03-28 15:29:43

标签: javascript ruby-on-rails-3.2 content-type

我想知道用户在我的Javascript代码中输入的给定网址的内容类型。实际上,我有一个下拉列表(html,csv,xls等),我想在用户输入url时这样做,我想检测url内容的类型并根据这个类型我想要设置我的下拉列表的值(html,csv,xls等)。我知道,我可以像这样使用Ruby获取内容类型:

require 'open-uri'
str = open('http://example.com')
str.content_type #=> "text/html"

或者,我也可以使用curl获取内容,然后解析它以了解内容类型。但是,我需要在我的Javascript代码中执行此操作,因为我需要在上面解释。有什么想法?

EDIT_1:

我在javascript中尝试了这段代码:

    $("#wiki_form_url").change(function(){
        $.ajax({
            type: "GET",
            url: "content.rb",
            data: {
//                input_url: $("#wiki_form_url").val()
            },
            dataType: "html"
        }).done(function (data) {
                    // `data` contains the content-type
                    alert('Success !!!');
                }).fail(function () {
                    alert("failed AJAX call");
                });
    });

我有一个ruby脚本content.rb,我在其中:

require 'open-uri'

str = open('http://www.ofdp.org/benchmark_indices/25')
str.content_type

但是,它似乎不起作用。我得到了Ajax失败。可能是因为脚本content.rb的url路径?我该如何在这里指定脚本路径? (相对或绝对)

3 个答案:

答案 0 :(得分:1)

same origin policy阻止您使用客户端JavaScript直接发现有关任意URI的信息(您控制的URI是另一个故事)。

您需要使用其他技术获取该信息,例如服务器端Ruby。

您只需将表单提交到服务器并将新网页返回到浏览器即可。

如果您不想离开页面,则可以使用Ajax传递数据。有很多Ajax教程,here is a good one from MDN

答案 1 :(得分:0)

以下是AJAX调用的示例:

$(document).ready(function () {
    $("#button_check").on("click", function () {
        $.ajax({
            type: "GET",
            url: "Your URL",
            data: {
                input_url: $("#textbox_id").val()
            },
            dataType: "html"
        }).done(function (data) {
            // `data` contains the content-type
            alert(data);
        }).fail(function () {
            alert("failed AJAX call");
        });
    });
});

您的HTML类似于:

<input type="text" id="textbox_id" />
<input type="button" id="button_check" value="Submit" />

你的Ruby代码就像:

require 'open-uri'
class TestController < ApplicationController
  def index
    req = open(params[:input_url])
    render :text => req.content_type
  end
end

我之前从未使用过RoR,所以我不知道这是正确的还是稍微有效。但是,在加入几个教程时,我可以迅速想出来。它只是您似乎正在寻找的概念。您需要弄清楚如何将URL映射到此方法,然后更新AJAX选项url以使用它。

所以在Javascript代码中 - 在done方法中,这意味着整个AJAX请求成功,data变量应该包含Ruby代码req.content_type的结果。

答案 2 :(得分:0)

Atlast我可以在@Ian的帮助下找出整件事。这是我完成的代码:在javascript文件中:

    $("#wiki_form_url").change(function () {
        $.ajax({
            type: "GET",
            url: "/wiki_forms/content",
            data: {
                input_url: $("#wiki_form_url").val()
            },
            dataType: "text"
        }).done(function (data) {
                    // `data` contains the content-type
                    alert('Success');
                    console.log(data);
//                    alert(data);
                }).fail(function () {
                    alert("failed AJAX call");
                });
    });

在我的wiki_forms控制器中,我创建了一个名为content的新方法:

  def content 
    req = open(params[:input_url])
    render :text => req.content_type 
  end

然后在routes.rb文件中添加了一个新路由:

  get "/wiki_forms/content" => 'wiki_forms#content'

并使用 / wiki_forms / content 作为ajax请求网址。而且,现在一切都很顺利。